QueryDSL-Sortierung funktioniert nicht mit Spring Data
Ich benutze geradeJpaSort
mit Spring Data Commons 1.9.1 und Spring JPA 1.7.1. Ich muss QueryDSL verwenden, weilit @JPA kann die Sortierung für Nullwerte nicht definiert werden..
Dies ist mein Repository
public interface DatasheetRepository extends JpaRepository<Datasheet, Long>, JpaSpecificationExecutor<Datasheet>
Ich mache das in meinem Controller:
Page<Datasheet> page = m_datasheetRepository.findAll( new PageRequest( pageNumber, pageSize, createSortForDatasheets() ) );
Das ist, was ich mit JPA hatte:
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 ) ) );
}
Das habe ich für QueryDSL geändert:
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 ) );
}
Doch nichts scheint sortiert zu werden. Ich habe die DEBUG-Protokollierung aktiviert und sehe Folgendes:
Rendered criteria query -> select generatedAlias0 from Datasheet as generatedAlias0 order by generatedAlias0.name asc, generatedAlias0.name asc
Wenn ich es ändere zu:
private Sort createSortForDatasheets()
{
return new QSort(QDatasheet.datasheet.name.desc());
}
Dann funktioniert die Sortierung nach dem Namen meines "Datasheet" -Typs in umgekehrter Reihenfolge.
Dies ist meine "Datenblatt" -Entität:
@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;
Und das ist "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;
AKTUALISIEREN
Wenn ich das @ ändecreateSortForDatasheets
dazu:
private Sort createSortForDatasheets()
{
return new QSort( new OrderSpecifier<>( Order.ASC, QComponentType.componentType.id, OrderSpecifier.NullHandling.NullsLast ) );
}
Dann zeigt die Protokollierung:
Rendered criteria query -> select generatedAlias0 from Datasheet as generatedAlias0 order by generatedAlias0.id asc
Beachten Sie, wie die ID des "Datenblattes" verwendet wird und nicht die ID von "ComponentType".