0

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

@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 完成这种排序吗?

编辑:我在这里需要一种动态方法,因为我的排序可以通过用户选择的各种字段来完成,这一点很重要。

4

1 回答 1

1

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

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

这是一个完整的示例,它MyTableMyContainerwith连接MyItem并选择按ofMyTable排序的实体idMyItem

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();

所有以 an 结尾的类_都是JPA 元模型类。它们中的每一个都描述了具有相同名称但没有_.

于 2017-12-29T17:04:07.273 回答