현재 스프링 데이터 공유 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가 어떻게 사용되는지주의하십시오.
이것은 스프링 데이터의 버그처럼 보입니다. 나는 그것을 조사 할 것이다. –