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".

Antworten auf die Frage(2)

Ihre Antwort auf die Frage