2014-12-16 3 views
2

В настоящее время я использую JpaSort с данными Spring Data 1.9.1 и Spring JPA 1.7.1. Мне нужно использовать QueryDSL, потому что JPA does not allow defining the sort for null values.Сортировка QueryDSL не работает с данными Spring

Это мой Repository

public interface DatasheetRepository extends JpaRepository<Datasheet, Long>, JpaSpecificationExecutor<Datasheet> 

Я делаю это в моем контроллере:

Page<Datasheet> page = m_datasheetRepository.findAll(new PageRequest(pageNumber, pageSize, createSortForDatasheets())); 

Это то, что я имел с JPA:

private Sort createSortForDatasheets() 
{ 
    // First sort on the component type name, then on the subtype name 
    return new JpaSort(JpaSort.path(Datasheet_.componentSubtype).dot(ComponentSubtype_.componentType).dot(ComponentType_.name)) 
      .and(new JpaSort(JpaSort.path(Datasheet_.componentSubtype).dot(ComponentSubtype_.name))); 
} 

Это то, что у меня есть изменил его на QueryDSL:

private Sort createSortForDatasheets() 
{ 
    return new QSort(new OrderSpecifier<>(Order.ASC, QDatasheet.datasheet.componentSubtype.componentType.name,OrderSpecifier.NullHandling.NullsLast)) 
      .and(new OrderSpecifier<>(Order.ASC, QDatasheet.datasheet.componentSubtype.name, OrderSpecifier.NullHandling.NullsLast)); 
} 

Однако, похоже, ничего не сортируется. Я включил протоколирования DEBUG и я вижу это:

Rendered criteria query -> select generatedAlias0 from Datasheet as generatedAlias0 order by generatedAlias0.name asc, generatedAlias0.name asc 

Если изменить его на:

private Sort createSortForDatasheets() 
{ 
    return new QSort(QDatasheet.datasheet.name.desc()); 
} 

Тогда сортировка по имени моего типа «Технический паспорт» в обратном порядке делает работу.

Это мой "Технический паспорт" лицо:

@Entity 
public class Datasheet 
{ 
// ------------------------------ FIELDS ------------------------------ 

    @Id 
    @GeneratedValue 
    private long id; 

    @Column(unique = true) 
    private String name; 
    private String description; 

    @ManyToOne 
    private ComponentSubtype componentSubtype; 

    @OneToMany(cascade = CascadeType.REMOVE) 
    private Set<DatasheetDocument> documents; 

И это "ComponentSubtype":

@Entity 
public class ComponentSubtype 
{ 
    @Id 
    @GeneratedValue() 
    private long id; 

    private String name; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "parent_id",insertable=false,updatable=false) 
    private ComponentType componentType; 

UPDATE:

Если изменить createSortForDatasheets к этому:

private Sort createSortForDatasheets() 
{ 
    return new QSort(new OrderSpecifier<>(Order.ASC, QComponentType.componentType.id, OrderSpecifier.NullHandling.NullsLast)); 
} 

Затем каротаж показывает:

Rendered criteria query -> select generatedAlias0 from Datasheet as generatedAlias0 order by generatedAlias0.id asc 

Обратите внимание, как используется идентификатор «Техническое описание», а не идентификатор «ComponentType».

+0

Это похоже на ошибку в данных Spring. Я буду смотреть в него. –

ответ

1

Похоже на ошибку Spring Data. Я подал на него вопрос https://jira.spring.io/browse/DATACMNS-621

+0

Ошибка подтверждена. Был установлен только сегодня в git: https://github.com/spring-projects/spring-data-commons/pull/111 –

Смежные вопросы