2016-12-16 36 views
0

如何通過對聯合實體調用訂單?我試圖實現與以下內容:JPA CRITERIA查詢通過加入列的順序

SELECT * FROM人員P內的p.id加入電話T = t.person_id通過s.name DESC加入上s.id = t.sim_id爲了SIM小號

@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訂購,但我不知道怎麼辦。

+0

您試過的Criteria查詢在哪裏? –

+0

thx的問題,我更新我的帖子有關我到目前爲止做了什麼 – Wait

回答

2

在JPA規範,您可以使用:

query.orderBy(builder.asc(root.join("telephonesNumber").get("sim").get("name"))); 

通過SIM卡名稱進行排序。

有關詳細信息: https://en.wikibooks.org/wiki/Java_Persistence/Querying#Joining.2C_querying_on_a_OneToMany_relationship

如果您在使用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 

有關詳細信息:

https://github.com/abhilekhsingh041992/spring-boot-samples/blob/master/jpa/src/main/java/example/springboot/jpa/repository/PersonRepository.java

+0

thx答覆,我需要的解決方案不是爲存儲庫,但在我的規範類,我需要排序我的實體通過sim.name,抱歉的錯誤,我更新我的帖子 – Wait

+0

我不知道。請檢查編輯並讓我知道它是否有效。 –

+0

謝謝,它的工作原理 – Wait