我有以下类描述的实体映射数据库:
@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)。它适用于基本排序,但当我想通过某种类型的MyTable
对MyItem.id
进行排序时,我遇到了问题。示例:每个容器有2个不同类型的项目,我想按项目ID排序,只有一种类型,忽略第二个值。甚至可以使用Spring Data JPA完成这样的排序吗?
编辑:我需要一个动态方法,因为重要的是我的排序可以由用户选择的各个字段完成。
加入实体后,可以使用orderBy
接口的CriteriaQuery
方法和asc
接口的desc
或CriteriaBuilder
方法来定义ORDER BY子句。
cq.orderBy(cb.asc(item.get(MyItem_.id)));
这是一个完整的例子,将MyTable
与MyContainer
与MyItem
连接,并选择由MyTable
的id
排序的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课程。他们每个人都描述了没有_
的同名实体。