gpt4 book ai didi

java - QueryDSL 排序不适用于 Spring Data

转载 作者:行者123 更新时间:2023-11-30 11:11:14 26 4
gpt4 key购买 nike

我目前正在将 JpaSort 与 Spring Data commons 1.9.1 和 Spring JPA 1.7.1 一起使用。我需要使用 QueryDSL 因为 JPA does not allow defining the sort for null values .

这是我的仓库

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

我在我的 Controller 中这样做:

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;

更新:

如果我将 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。

最佳答案

它看起来像 Spring Data 错误。我为此提出了一个问题 https://jira.spring.io/browse/DATACMNS-621

关于java - QueryDSL 排序不适用于 Spring Data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27502137/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com