我目前正在使用JpaSort
使用 Spring Data commons 1.9.1 和 Spring JPA 1.7.1。我需要使用 QueryDSL 因为JPA 不允许定义空值的排序 https://stackoverflow.com/questions/23897376/jpasort-using-nulls-last-with-spring-data.
这是我的存储库
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
请注意如何使用“Datasheet”的 id,而不是“ComponentType”的 id。