如何使用JPA Criteria API进行过滤排序?

问题描述 投票:0回答:1

我有以下类描述的实体映射数据库:

@Entity(name = "myitem")
public class MyItem {
   @Id
   private Long id;
   private String type;
}

@Entity(name = "mycontainer")
public class MyContainer {
   @Id
   private Long id;
   @ManyToOne
   private MyItem item;
   ...
}

@Entity(name = "mytable")
public class MyTable {
   @Id
   private Long id;
   @OneToMany
   private Set<MyContainer> containers;
   ...
}

我正在使用JPA Criteria API来过滤和排序我的数据。排序和过滤参数动态变化并从db获得结果我使用Spring Data JPA Page<S> findAll(Example<S> example, Pageable pageable)doc)。它适用于基本排序,但当我想通过某种类型的MyTableMyItem.id进行排序时,我遇到了问题。示例:每个容器有2个不同类型的项目,我想按项目ID排序,只有一种类型,忽略第二个值。甚至可以使用Spring Data JPA完成这样的排序吗?

编辑:我需要一个动态方法,因为重要的是我的排序可以由用户选择的各个字段完成。

java spring spring-data spring-data-jpa jpa-criteria
1个回答
0
投票

加入实体后,可以使用orderBy接口的CriteriaQuery方法和asc接口的descCriteriaBuilder方法来定义ORDER BY子句。

cq.orderBy(cb.asc(item.get(MyItem_.id)));

这是一个完整的例子,将MyTableMyContainerMyItem连接,并选择由MyTableid排序的MyItem实体

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<MyTable> cq = cb.createQuery(MyTable.class);
Root<MyTable> root = cq.from(MyTable.class);
SetJoin<MyTable, MyContainer> containers = root.join(MyTable_.containers);
Join<MyContainer, MyItem> item = containers.join(MyContainer_.item);

cq.orderBy(cb.asc(item.get(MyItem_.id)));

TypedQuery<MyTable> query = em.createQuery(cq);
List<MyTable> tables = query.getResultList();

for (MyTable t : tables) {
    log.info(t);
}

em.getTransaction().commit();
em.close();

所有以_结尾的课程都是JPA metamodel课程。他们每个人都描述了没有_的同名实体。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.