【问题标题】:Map SQL on Predicates在谓词上映射 SQL
【发布时间】:2017-10-12 12:51:33
【问题描述】:

我有一些 SQL

select id, name from table where id = '1' and  name = 'A'
                             or  id = '2' and  name = 'B'
                             or  id = '3' and  name = 'C';

SQL 的结果令我满意,但无论如何我必须将该 SQL 映射到 JPA 的谓词。

我现在拥有的

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

Predicate id1 = criteriaBuilder.like(root.get(id), "%" + "1" + "%");
predicates.add(criteriaBuilder.and(id1));

Predicate nameA = criteriaBuilder.like(root.get(name), "%" + "A" + "%");
predicates.add(criteriaBuilder.and(nameA));

Predicate id2 = criteriaBuilder.like(root.get(id), "%" + "2" + "%");
predicates.add(criteriaBuilder.and(id2));

Predicate name2 = criteriaBuilder.like(root.get(name), "%" + "B" + "%");
predicates.add(criteriaBuilder.and(name2));

Predicate id3 = criteriaBuilder.like(root.get(id), "%" + "3" + "%");
predicates.add(criteriaBuilder.and(id3));

Predicate name3 = criteriaBuilder.like(root.get(name), "%" + "C" + "%");
predicates.add(criteriaBuilder.and(name3));

query.where(criteriaBuilder.or(predicates.toArray(new Predicate[predicates.size()])));
return entityManager.createQuery(query).getResultList();

谓词查询也返回一些冗余数据,除了 SQL 查询。

请更正我的谓词条件以获得与 sql 查询相同的结果。

非常感谢!

【问题讨论】:

  • reduntant 是什么意思?
  • 还有其他符合该条件的数据。例如有名称为 A 但 id 为 4 的行

标签: java sql hibernate jpa predicates


【解决方案1】:

我会写类似的东西:

Predicate id1 = criteriaBuilder.like(root.get(id), "%" + "1" + "%");
Predicate nameA = criteriaBuilder.like(root.get(name), "%" + "A" + "%");

    Predicate id1nameA = criteriaBuilder.and(id1,nameA);
    predicates.add(criteriaBuilder.or(id1nameA));
    //...continue for the others

无论如何使用 like 它与 = 不同,所以它可以产生这样的问题。

如果您的 jpa 实现是 Hibernate,您可以通过在 persistence.xml

中添加以下代码行来向控制台显示 sql
<properties>
      <property name="hibernate.dialect" value="..somethinginhere.."/>
      <property name="hibernate.show_sql" value="true"/>
</properties> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多