按连接列排序的 JPA CRITERIA QUERY
JPA CRITERIA QUERY with order by joined columns
如何在已连接的实体上调用 order by?我正在尝试通过以下方式实现以下目标:
select * 来自人 p inner 在 p.id=t.person_id 加入电话 t 在 s.id=t.sim_id 加入 sim s order by s.name描述
@Entity
public class Person implements Serializable{
@Id
private Long id;
@OneToMany(orphanRemoval = true, mappedBy = "person", fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
private List<Telephone> telephonesNumber;
@Entity
public class Telephone implements Serializable {
@Id
private String number;
@Id
@ManyToOne()
@JoinColumn(name = "person_id")
private Person person;
@Id
@ManyToOne(cascade = {})
@JoinColumn(name = "sim_id")
private Sim sim;
@Entity
public class Sim implements Serializable {
@Id
private Long id;
@Column(unique = true)
private String name;
我使用规范接口,在此示例中,排序是在字段 person.id 上进行的,并且有效
public class PersonSpecification implements Specification<Person> {
@Override
public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
List<Predicate> predicates = new ArrayList<>();
// there is many different conditions for example
// if(someCondition!=null) {
// predicates.add(builder.like(root.get("someProperty"), someValue));
// }
query.groupBy(root.get("id"));
//there I want to order by Sim.name i dont know how
query.orderBy(builder.asc(root.get("phone")));//this works
return builder.and((predicates.toArray(new Predicate[predicates.size()])));
}
我想通过 Sim.name 订购,但我不知道如何订购。
在 JPA 规范中,您可以使用:
query.orderBy(builder.asc(root.join("telephonesNumber").get("sim").get("name")));
按 sim 名称排序。
如果您使用 JPA 查询:
@Query("select s from Person p
join p.telephonesNumber t
join t.sim s order
by t.sim.id desc")
它将产生这个:
select * from person p
inner join telephone t on p.id=t.person_id
inner join sim s on t.sim_id=s.id
order by t.sim_id desc
更多详情:
另一种方法是使用查询方法:
List<Telephone> findAllByOrderBySimIdAsc();
看看这个findAllByOrderBySimIdAsc
使用之前的代码,您可以从 Telephone 中获取按 Sim Id 排序的所有行。
如何在已连接的实体上调用 order by?我正在尝试通过以下方式实现以下目标:
select * 来自人 p inner 在 p.id=t.person_id 加入电话 t 在 s.id=t.sim_id 加入 sim s order by s.name描述
@Entity
public class Person implements Serializable{
@Id
private Long id;
@OneToMany(orphanRemoval = true, mappedBy = "person", fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
private List<Telephone> telephonesNumber;
@Entity
public class Telephone implements Serializable {
@Id
private String number;
@Id
@ManyToOne()
@JoinColumn(name = "person_id")
private Person person;
@Id
@ManyToOne(cascade = {})
@JoinColumn(name = "sim_id")
private Sim sim;
@Entity
public class Sim implements Serializable {
@Id
private Long id;
@Column(unique = true)
private String name;
我使用规范接口,在此示例中,排序是在字段 person.id 上进行的,并且有效
public class PersonSpecification implements Specification<Person> {
@Override
public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
List<Predicate> predicates = new ArrayList<>();
// there is many different conditions for example
// if(someCondition!=null) {
// predicates.add(builder.like(root.get("someProperty"), someValue));
// }
query.groupBy(root.get("id"));
//there I want to order by Sim.name i dont know how
query.orderBy(builder.asc(root.get("phone")));//this works
return builder.and((predicates.toArray(new Predicate[predicates.size()])));
}
我想通过 Sim.name 订购,但我不知道如何订购。
在 JPA 规范中,您可以使用:
query.orderBy(builder.asc(root.join("telephonesNumber").get("sim").get("name")));
按 sim 名称排序。
如果您使用 JPA 查询:
@Query("select s from Person p
join p.telephonesNumber t
join t.sim s order
by t.sim.id desc")
它将产生这个:
select * from person p
inner join telephone t on p.id=t.person_id
inner join sim s on t.sim_id=s.id
order by t.sim_id desc
更多详情:
另一种方法是使用查询方法:
List<Telephone> findAllByOrderBySimIdAsc();
看看这个findAllByOrderBySimIdAsc
使用之前的代码,您可以从 Telephone 中获取按 Sim Id 排序的所有行。