我有下表:
我想使用以下规则形成一个查询: 获取产品 1,其中类型不是类型 1 也不是类型 2,并且 flavor 不是 flavor 1。
类型可以是类型 1、类型 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")));
问题是这个查询什么也没返回……我错过了什么吗? 请注意,我的问题指的是逻辑而不是语法,因为语法是通过形成返回一些虚拟结果的更简单的查询来检查的。 谢谢!
最佳答案
尝试删除顶级 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()]));
最重要的是,请确保您的数据库内容与您的查询匹配,因此确实应该返回一些内容:)
正如我在“表”中看到的,“类型”列中没有空值。数据库中该列是否有空值?也许在数据库中它不为空,只有空字符串(这是一个很大的区别)
关于java - 如何形成 JPA 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36283109/