淮安建设局网站最新产品上市代理加盟
news/
2025/9/22 23:14:28/
文章来源:
淮安建设局网站,最新产品上市代理加盟,一般网站建设,洛宁县东宋乡城乡建设局网站jpa 手动预编译JPA提供了几种查询数据的方法。 可以根据各种标准#xff08;例如#xff0c;使用的语言#xff08;SQL与JPQL#xff09;或查询是静态的#xff08;编译时间#xff09;还是动态的#xff08;执行时间#xff09;#xff09;对此类替代方案进行分类。 … jpa 手动预编译 JPA提供了几种查询数据的方法。 可以根据各种标准例如使用的语言SQL与JPQL或查询是静态的编译时间还是动态的执行时间对此类替代方案进行分类。 静态查询是使用Entity类定义本身中的注释NamedQuery javax.persistence.NamedQuery 和NamedQueries javax.persistence.NamedQueries 定义的 NamedQuery(namefindAllCustomersWithName,querySELECT c FROM Customer c WHERE c.name LIKE :custName) 另一方面 EntityManager提供了分别接受JPQL或SQL查询的createQuery…和createNativeQuery…方法。 因此可以在编译或执行时定义查询。 注意 建议始终使用Query中的 setParameter…方法来使用参数化查询以避免SQL注入漏洞。 标准API 但是JPA提供了另一种查询对象的方法 Criteria API 。 确实切换到JPA的动机之一是处理对象而不是SQL方言不是吗 让我们看一个示例代码。 实体定义 Entity
public class User {Idprivate Integer userId;BasicColumn(length15, nullablefalse)private String name;BasicColumn(length64, nullablefalse)private String userDigestedPasswd;BasicColumn(length50, nullabletrue)private String email;BasicColumn(nullablefalse)public Integer privilegeLevel;BasicColumn(nullablefalse)private Boolean active;
} 让我们查询数据库并检查结果使用JUnit public class UserTest {Testpublic void testUserCriteria(){
EntityManagerFactory emf null;
EntityManager em null;
try {emf Persistence.createEntityManagerFactory(criteria);em emf.createEntityManager();final CriteriaBuilder cb em.getCriteriaBuilder();final CriteriaQueryUser q cb.createQuery(User.class);final RootUser users q.from(User.class);final Predicate condition cb.equal(users.get(privilegeLevel), 5);q.select(users).where(condition).orderBy(cb.asc(users.get(userId)));em.getTransaction().begin();ListUser result em.createQuery(q).getResultList();em.getTransaction().commit();assertNotNull(result);assertEquals(2, result.size());assertEquals(1, (int)result.get(0).getUserId());assertEquals(Pepe, result.get(0).getName());assertEquals(3, (int)result.get(1).getUserId());assertEquals(Dolores, result.get(1).getName());} catch (Exception e) {fail(Unexpected Exception e.getMessage());
} finally {if (em ! null)em.close();if (emf ! null)emf.close();
}
}
} 以下几行显示查询的创建 final CriteriaBuilder cb em.getCriteriaBuilder();final CriteriaQueryUser q cb.createQuery(User.class);final RootUser users q.from(User.class);final Predicate condition cb.equal(users.get(privilegeLevel);q.select(users).where(condition).orderBy(cb.asc(users.get(userId 首先从EntityManager获得CriteriaBuilder 。 然后获取一个CriteriaQuery实例将该类设置为保存结果。 在我们的例子中 User.class final CriteriaBuilder cb em.getCriteriaBuilder();
final CriteriaQueryUser q cb.createQuery(User.class); 接下来必须设置要对其运行查询的实体 final RootUser users q.from(User.class); 现在是时候设置查询匹配条件了。 在示例代码中条件只是属性privilegeLevel等于5 final Predicate condition cb.equal(users.get(privilegeLevel), 5); 最后构建查询以在Root上添加条件。 也可以设置分组和排序选项即对userId设置升序 q.select(users).where(condition).orderBy(cb.asc(users.get(“userId”))); 请查看CriteriaBuilder中的不同选项。 可以在CriteriaQuery中找到分组和排序选项。 使用元模型进行编译时检查 请注意我们刚刚构建的查询需要跟踪对象属性名称。 例如要构建查询将使用属性privilegeLevel的名称。 但是如果稍后更改属性名称则代码将编译并且仅在运行时失败 final CriteriaQueryUser q cb.createQuery(User.class);final RootUser users q.from(User.class);final Predicate condition cb.equal(users.get(privilegeLevel), 5);q.select(users).where(condition).orderBy(cb.asc(users.get(userId))); 那不好 幸运的是使用元模型我们将能够构建编译时检查的查询。 可以在The Java EE6 Tutorial中找到简短的介绍。 使用元模型代码将引用对象的SingularAttribute而不是使用包含对象属性名称的String。 因此如果稍后更改对象属性则编译器将为我们标记该属性。 首先必须创建对应的元模型类 EntityType 。 尽管可以通过多种方式实现但对于openJPA实现最简单的方法可能是添加一个openJPA构建标记 -Aopenjpa.metamodel true 。 因此我们创建了User_类它是User的对应元模型类 * Generated by OpenJPA MetaModel Generator Tool. **/
package com.wordpress.tododev.criteria.entities;
import javax.persistence.metamodel.SingularAttribute;
javax.persistence.metamodel.StaticMetamodel
(valuecom.wordpress.tododev.criteria.entities.User.class)
javax.annotation.Generated
(valueorg.apache.openjpa.persistence.meta.AnnotationProcessor6,dateMon Mar 04 16:47:46 CET 2013)
public class User_ {public static volatile SingularAttributeUser,Boolean active;public static volatile SingularAttributeUser,String email;public static volatile SingularAttributeUser,String name;public static volatile SingularAttributeUser,Integer privilegeLevel;public static volatile SingularAttributeUser,String userDigestedPasswd;public static volatile SingularAttributeUser,Integer userId;
} 如果将此类添加到代码库中则以后对User类的任何更改都不会引起注意。 而且将自动生成的项目添加到代码版本控制系统中不是一个好主意。 使用ant maven或类似工具可以添加目标以创建元模型类。 在更改JPA实体后应执行该目标。 也可以使用IDE。 例如对于使用Eclipse的只需要已经提到编译标志添加属性- Java的反编译注解处理器和的libJAR包含所选择的JPA实现第厂路内注释处理器的注释处理器可能导致自动模式下的编译问题前提是必须在使用它的代码之前编译元模型类。 让我们向套件添加另一个测试。 这个不会提供包含属性名称的String而是使用metamodel类 Testpublic void testUserCriteriaMetaModel(){EntityManagerFactory emf null;EntityManager em null;try {emf Persistence.createEntityManagerFactory(criteria);em emf.createEntityManager();final CriteriaBuilder cb em.getCriteriaBuilder();final CriteriaQueryUser q cb.createQuery(User.class);final Metamodel m em.getMetamodel();final RootUser user q.from(m.entity(User.class));final Predicate condition cb.equal(user.get(User_.privilegeLevel), 5);q.select(user).where(condition).orderBy(cb.asc(user.get(User_.userId)));em.getTransaction().begin();ListUser result em.createQuery(q).getResultList();em.getTransaction().commit();assertNotNull(result);assertEquals(2, result.size());assertEquals(1, (int)result.get(0).getUserId());assertEquals(Pepe, result.get(0).getName());assertEquals(3, (int)result.get(1).getUserId());assertEquals(Dolores, result.get(1).getName());
} catch (Exception e) {fail(Unexpected Exception e.getMessage());} finally {if (em ! null)em.close();if (emf ! null)emf.close();}} 更相关的更改是user.getUser_.privilegeLevel而不是users.get“ privilegeLevel”和 user.getUser_.userId而不是 users.get“ userId”。 从GitHub下载源代码。 翻译自: https://www.javacodegeeks.com/2014/08/compile-time-checking-jpa-queries.htmljpa 手动预编译
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910706.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!