2014-12-16 3 views
2

현재 스프링 데이터 공유 1.9.1 및 스프링 JPA 1.7.1과 함께 JpaSort을 사용 중입니다. JPA does not allow defining the sort for null values 때문에 QueryDSL을 사용해야합니다.QueryDSL 정렬이 스프링 데이터와 작동하지 않음

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))); 
} 

이 내가 무엇을 가지고 :

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

이 내가 JPA로 한 것입니다 :

내 저장소

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

내 컨트롤러에이 일을하고있다 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 로깅을 활성화하고 나는이 참조 :

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

역순으로 내 "데이터 시트"유형의 이름으로 정렬이하는 일 : 나는 그것을 변경하는 경우

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

합니다.

@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"의 ID가 아니라 "Datasheet"의 ID가 어떻게 사용되는지주의하십시오.

+0

이것은 스프링 데이터의 버그처럼 보입니다. 나는 그것을 조사 할 것이다. –

답변

1

봄 데이터 버그처럼 보입니다. 내가 문제를 제기했다. https://jira.spring.io/browse/DATACMNS-621

+0

버그가 확인되었습니다. 오늘 git에서 수정되었습니다 : https://github.com/spring-projects/spring-data-commons/pull/111 –

관련 문제