我有下表:
我想使用以下规则形成查询: 获取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")));
问题是这个查询什么都没有返回...我错过了什么? 请注意,我的问题是指逻辑而不是语法,因为通过形成返回一些虚拟结果的更简单的查询来检查语法。 谢谢!
答案 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]