java - 如何形成 JPA 查询?

标签 java mysql jpa predicates

我有下表:

enter image description here

我想使用以下规则形成一个查询: 获取产品 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/

相关文章:

java - 仅使用 Spring Boot Data JPA/Java 8 Instant 查询日期?

java - 如何选择使用 List<String> 作为 Repository 的输入?

java - 在 Java 中,如何从当前正在运行的 actionPerformed 线程重新绘制面板?

java - org.springframework.beans.TypeMismatchException : Failed to convert value 'java.lang.String' to 'java.lang.Class' spring

java - TreeMap 出现异常 "fromKey > toKey"(fromKey 大于 toKey?)

javascript - 在 Java 和 MySQL 中使用日期格式

javascript - 在 javascript 类型的对象上找不到属性或字段 'location'

java - 服务器使用 websocket 和 netty 发送问候消息 -> 导致异常

mysql - 截断 mediawiki

mysql - 更新到 WordPress 4.8.2 后出现 SQL 语法错误