在Predicates上映射SQL

时间:2017-10-12 12:51:34

标签: java sql hibernate jpa predicates

我有一些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的Predicates。

我现在拥有什么

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查询相同的结果。

非常感谢!

1 个答案:

答案 0 :(得分:1)

我会写点什么:

var table = $('#example').DataTable({
    "columnDefs": [
            { "type": "natural", targets: 0 },
            { "type": "natural", targets: 1 }
    ]
});

无论如何喜欢 = 不同,所以它可以解决这个问题。

  

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

中添加以下代码行来向控制台显示sql
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