2016-12-16 10 views
0

Как вызвать заказ на объединенное предприятие? Я пытаюсь достичь следующего с:JPA CRITERIA QUERY с заказом по объединенным столбцам

выберите * от человека р внутреннего соединения телефона т на p.id = t.person_id присоединиться к сим с на s.id = t.sim_id порядка s.name DESC

@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

где ваш запрос к критериям, который вы пробовали? –

+0

thx для вопроса, я обновляю свое сообщение о том, что мне удалось сделать до сих пор – Wait

ответ

2

В спецификации JPA вы можете использовать:

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

сортировать по сим именем.

Для получения более подробной информации: https://en.wikibooks.org/wiki/Java_Persistence/Querying#Joining.2C_querying_on_a_OneToMany_relationship

Если вы используете JPA Query:

@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