В настоящее время я использую JpaSort
с данными Spring Data 1.9.1 и Spring JPA 1.7.1. Мне нужно использовать QueryDSL, потому что JPA does not allow defining the sort for null values.Сортировка QueryDSL не работает с данными Spring
Это мой Repository
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
Обратите внимание, как используется идентификатор «Техническое описание», а не идентификатор «ComponentType».
Это похоже на ошибку в данных Spring. Я буду смотреть в него. –