spring query dsl: 如何按两个数据库字段排序,其中一个是外键?
spring query dsl: how to sort by two database fields, one of the being foreign key?
我正在使用 Spring 4.1.6 和 QueryDSL 3.7.4。
我已经使用 Telosys 工具创建了我的实体,并使用 the apt-maven-plugin.
创建了我的 QueryDSL 实体
我没有使用 @Query 标签,因为我认为如果我这样做,我无法获得 Page 结果,并且由于性能原因,我必须在没有 @Query 注释的情况下执行此操作(也许我对此感到困惑)。
我在这里放了一段我的实体代码:
IncidenciasEntity.java:
@ManyToOne
@JoinColumn(name = "ID_TIPO_INCIDENCIA", referencedColumnName = "ID_TIPO_INCIDENCIA")
private TiposIncidenciasEntity tiposIncidencias;
TiposIncidenciasEntity.java
//----------------------------------------------------------------------
// ENTITY PRIMARY KEY ( BASED ON A SINGLE FIELD )
//----------------------------------------------------------------------
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID_TIPO_INCIDENCIA", nullable=false)
private Integer idTipoIncidencia ;
我的 Web 应用程序工作正常,但有一件事我无法实现:我想对大型 MySQL table 的输出进行排序和分页,其中一个字段我想排序的是外键。我已经执行了两种方法:
方法一:
public Page<IncidenciasEntity> obtenerPaginaIncidenciasOrdenYPaginacionInicial(int paginaMas1,
int numIncidencias)
{
OrderSpecifier<Integer> sortOrder1 = QIncidenciasEntity.incidenciasEntity.idIncidencia.asc();
OrderSpecifier<Integer> sortOrder2 = QIncidenciasEntity.incidenciasEntity.tiposIncidencias().idTipoIncidencia.asc();
QSort qsort = new QSort(sortOrder1, sortOrder2);
return incidenciasRepo.findAll(new QPageRequest(paginaMas1 - 1, numIncidencias, qsort));
}
方法 1 产生错误:No 属性 idTipoIncidencia found for type IncidenciasEntity!
方法 2(没有 QueryDSL,只有 Spring Data JPA):
public Page<IncidenciasEntity> obtenerPaginaIncidenciasOrdenYPaginacionInicial(int paginaMas1,
int numIncidencias)
{
Order criterioOrdenacion1 = new Order(Direction.ASC, "idIncidencia");
Order criterioOrdenacion2 = new Order(Direction.ASC, "tiposIncidencias.idTipoIncidencia");
Sort criterioOrdenacionMixto = new Sort(criterioOrdenacion1, criterioOrdenacion2);
return incidenciasRepo.findAll(
new PageRequest(paginaMas1 - 1, numIncidencias, criterioOrdenacionMixto));
}
方法 2 不显示任何错误,但未按照我的意愿按字段 idTipoIncidencia 排序。
注意:我不想让它只用 QueryDSL,我想让它无论如何都能用,即使有一个 jpa 存储库。
如果您的存储库扩展 PagingAndSortingRepository
,只需 findAll(new PageRequest(page, size, new Sort("idIncidencia", "tiposIncidencias")))
就足够了。 idIncidencia
将转换为 ID_INCIDENCIA
列,tiposIncidencias
将自动转换为 ID_TIPO_INCIDENCIA
列。
我用您的代码创建了一个 sample application,它通过简单调用 findAll
演示了正确的排序顺序。该示例包含一个单元测试,该单元测试将一些记录添加到表中,以所需的排序顺序检索它们,然后检查它们是否确实以所需的顺序返回。
我正在使用 Spring 4.1.6 和 QueryDSL 3.7.4。
我已经使用 Telosys 工具创建了我的实体,并使用 the apt-maven-plugin.
创建了我的 QueryDSL 实体我没有使用 @Query 标签,因为我认为如果我这样做,我无法获得 Page 结果,并且由于性能原因,我必须在没有 @Query 注释的情况下执行此操作(也许我对此感到困惑)。
我在这里放了一段我的实体代码:
IncidenciasEntity.java:
@ManyToOne
@JoinColumn(name = "ID_TIPO_INCIDENCIA", referencedColumnName = "ID_TIPO_INCIDENCIA")
private TiposIncidenciasEntity tiposIncidencias;
TiposIncidenciasEntity.java
//----------------------------------------------------------------------
// ENTITY PRIMARY KEY ( BASED ON A SINGLE FIELD )
//----------------------------------------------------------------------
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID_TIPO_INCIDENCIA", nullable=false)
private Integer idTipoIncidencia ;
我的 Web 应用程序工作正常,但有一件事我无法实现:我想对大型 MySQL table 的输出进行排序和分页,其中一个字段我想排序的是外键。我已经执行了两种方法:
方法一:
public Page<IncidenciasEntity> obtenerPaginaIncidenciasOrdenYPaginacionInicial(int paginaMas1,
int numIncidencias)
{
OrderSpecifier<Integer> sortOrder1 = QIncidenciasEntity.incidenciasEntity.idIncidencia.asc();
OrderSpecifier<Integer> sortOrder2 = QIncidenciasEntity.incidenciasEntity.tiposIncidencias().idTipoIncidencia.asc();
QSort qsort = new QSort(sortOrder1, sortOrder2);
return incidenciasRepo.findAll(new QPageRequest(paginaMas1 - 1, numIncidencias, qsort));
}
方法 1 产生错误:No 属性 idTipoIncidencia found for type IncidenciasEntity!
方法 2(没有 QueryDSL,只有 Spring Data JPA):
public Page<IncidenciasEntity> obtenerPaginaIncidenciasOrdenYPaginacionInicial(int paginaMas1,
int numIncidencias)
{
Order criterioOrdenacion1 = new Order(Direction.ASC, "idIncidencia");
Order criterioOrdenacion2 = new Order(Direction.ASC, "tiposIncidencias.idTipoIncidencia");
Sort criterioOrdenacionMixto = new Sort(criterioOrdenacion1, criterioOrdenacion2);
return incidenciasRepo.findAll(
new PageRequest(paginaMas1 - 1, numIncidencias, criterioOrdenacionMixto));
}
方法 2 不显示任何错误,但未按照我的意愿按字段 idTipoIncidencia 排序。
注意:我不想让它只用 QueryDSL,我想让它无论如何都能用,即使有一个 jpa 存储库。
如果您的存储库扩展 PagingAndSortingRepository
,只需 findAll(new PageRequest(page, size, new Sort("idIncidencia", "tiposIncidencias")))
就足够了。 idIncidencia
将转换为 ID_INCIDENCIA
列,tiposIncidencias
将自动转换为 ID_TIPO_INCIDENCIA
列。
我用您的代码创建了一个 sample application,它通过简单调用 findAll
演示了正确的排序顺序。该示例包含一个单元测试,该单元测试将一些记录添加到表中,以所需的排序顺序检索它们,然后检查它们是否确实以所需的顺序返回。