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