gpt4 book ai didi

java - spring query dsl : how to sort by two database fields, 是外键之一?

转载 作者:行者123 更新时间:2023-11-29 02:46:47 25 4
gpt4 key购买 nike

我正在使用 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 表的输出进行排序和分页,其中我要排序的字段之一是外键。我已经执行了两种方法:

方法一:

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 property 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 来演示正确的排序顺序。该示例包含一个单元测试,该单元测试将一些记录添加到表中,以所需的排序顺序检索它们,然后检查它们是否确实以所需的顺序返回。

关于java - spring query dsl : how to sort by two database fields, 是外键之一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41067194/

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