使用JPA进行CriteriaQuery进行查询时,需要注意以下几个方面:
1. 配置persistence.xml
首先,需要在persistence.xml文件中配置JPA的provider和数据库连接信息。在provider中需要指定使用Hibernate等JPA实现,以及指定JPA的版本。例如:
<persistence-unit name="my-persistence-unit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>com.example.User</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="mysecretpassword"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
</properties>
</persistence-unit>
2. 构建CriteriaQuery
在使用CriteriaQuery进行查询时,需要使用EntityManager的getCriteriaBuilder()方法获取CriteriaBuilder实例,然后通过CriteriaBuilder构建CriteriaQuery。例如:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> user = query.from(User.class);
query.select(user);
上述代码中,CriteriaQuery的类型参数为User,表示需要查询的实体类型,从User.class获取Root实例,表示查询的根对象是User表。
3. 添加查询条件
在CriteriaQuery中可以添加各种查询条件,例如等于、大于等,通过CriteriaBuilder的equal、greaterThan等方法,以及and、or等逻辑操作符,将查询条件组合起来。例如:
Predicate p1 = cb.equal(user.get("name"), "jack");
Predicate p2 = cb.greaterThan(user.get("age"), 18);
query.where(cb.and(p1, p2));
上述代码中,使用equal方法添加查询条件"where name='jack'",使用greaterThan方法添加查询条件"where age>18",最后将两个条件用and方法进行组合。
4. 执行查询
最后使用EntityManager的createQuery方法,将CriteriaQuery对象转换为Query对象,并执行查询。例如:
TypedQuery<User> typedQuery = entityManager.createQuery(query);
List<User> users = typedQuery.getResultList();
上述代码中,使用createNamedQuery方法将CriteriaQuery对象转换为TypedQuery对象,最后使用getResultList方法将查询结果转换为List
示例1:查询年龄大于等于18岁的User列表
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> user = query.from(User.class);
query.select(user)
.where(cb.greaterThanOrEqualTo(user.get("age"), 18));
List<User> users = entityManager.createQuery(query).getResultList();
示例2:查询名字为Jack,年龄大于等于18岁的User
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> user = query.from(User.class);
Predicate p1 = cb.equal(user.get("name"), "Jack");
Predicate p2 = cb.greaterThanOrEqualTo(user.get("age"), 18);
query.select(user)
.where(cb.and(p1, p2));
User user = entityManager.createQuery(query).getSingleResult();
这里通过and方法组合了两个查询条件,并通过getSingleResult方法获取单个User对象。如果查询结果不唯一,将会抛出javax.persistence.NonUniqueResultException异常。如果查询结果为空,将会抛出javax.persistence.NoResultException异常。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用JPA进行CriteriaQuery进行查询的注意事项 - Python技术站