如何形成JPA查询?

时间:2016-03-29 11:33:44

标签: java mysql jpa predicates

我有下表:

enter image description here

我想使用以下规则形成查询: 获取product1,其中Type不是type1而不是type2,而Flavor不是flavor1。

Type可以是type1,type 2或null。

我形成了这样的查询:

    CriteriaBuilder cb = this.getEntityManager().getCriteriaBuilder();
    CriteriaQuery<Product> searchQuery = cb.createQuery(Product.class);
    Root<Product> u = searchQuery.from(Product.class);

    List<Predicate> predicates = new ArrayList<Predicate>();

    predicates.add(cb.and(cb.equal(u.get("product"),"product1"),cb.isNull(u.get("type")),cb.notEqual(u.get("flavor"), "flavor1")));

问题是这个查询什么都没有返回...我错过了什么? 请注意,我的问题是指逻辑而不是语法,因为通过形成返回一些虚拟结果的更简单的查询来检查语法。 谢谢!

2 个答案:

答案 0 :(得分:1)

尝试删除顶级AND谓词。将每个谓词添加到predicates并使用

从中创建where
predicates.add(cb.equal(u.get("product"),"product1"))
predicates.add(cb.isNull(u.get("type")));
predicates.add(cb.notEqual(u.get("flavor"), "flavor1")); // and so on

然后

searchQuery.where(predicates.toArray(new Predicate[predicates.size()]));

最重要的是,请确保您的数据库内容与您的查询匹配,所以确实应该返回一些内容:)

正如我在你所看到的那样&#34; table&#34; &#34;类型&#34;中没有空值柱。数据库中的这个columnt中是否有空值?也许它在db only空字符串中不为空(这是一个很大的区别)

答案 1 :(得分:1)

似乎非常直截了当。我认为您缺少的是数据库列中的NULL并不匹配任何内容,除非您完全指定它。换句话说,如果你说type not in ('type1', 'type2')隐含获取空列。如果你需要,你必须要求他们:

使用JPQL查询:

List<User> c1 = em.createQuery("select u from User u where (type not in ('type1', 'type2') or type = null) and flavor != 'flavor1'", User.class).getResultList();
System.out.println(c1);

使用CriteriaQuery:

// and with CriteriaQuery
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> q = cb.createQuery(User.class);
Root<User> u = q.from(User.class);
List<String> typeFilter = Arrays.asList("type1", "type2");
String flavor = "flavor1";
List<User> rs = em.createQuery(q.select(u).where( cb.or(cb.not(u.get("type").in(typeFilter)), cb.isNull(u.get("type"))), cb.notEqual(u.get("flavor"), flavor) ) ).getResultList();

这给了我以下输出:

Hibernate: select user0_.id as id1_0_, user0_.flavor as flavor2_0_, user0_.product as product3_0_, user0_.type as type4_0_ from User user0_ where (user0_.type not in  ('type1' , 'type2') or user0_.type is null) and user0_.flavor<>'flavor1'
[model.User@30263191]
Hibernate: select user0_.id as id1_0_, user0_.flavor as flavor2_0_, user0_.product as product3_0_, user0_.type as type4_0_ from User user0_ where (user0_.type not in  (? , ?) or user0_.type is null) and user0_.flavor<>?
[model.User@30263191]

有用的链接:How to query a column which value is null in JPA?