Java SpringQueryDSL:如何按两个数据库字段排序,其中一个是外键?

Java SpringQueryDSL:如何按两个数据库字段排序,其中一个是外键?,java,mysql,spring,jpql,querydsl,Java,Mysql,Spring,Jpql,Querydsl,我将Spring4.1.6与QueryDSL3.7.4一起使用 我使用Telosys工具创建了实体,使用QueryDSL工具创建了实体 我没有使用@Query标记,因为我想如果我使用了,我就无法获得一页结果,而且出于性能原因,我必须在没有@Query注释的情况下使用它(可能我对此感到困惑) 我在这里放了一段我的实体代码: IncidenciasEntity.java: @ManyToOne @JoinColumn(name = "ID_TIPO_INCIDENCIA", referencedCo

我将Spring4.1.6与QueryDSL3.7.4一起使用

我使用Telosys工具创建了实体,使用QueryDSL工具创建了实体

我没有使用@Query标记,因为我想如果我使用了,我就无法获得一页结果,而且出于性能原因,我必须在没有@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表的输出进行排序和分页,其中我想排序的字段之一是外键。我执行了两种方法:

方法1:

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));
    }
public Page obtenerpaginaincidenciasordenypaginacionical(intpaginamas1,
int numIncidencias)
{   
OrderSpecifier sortOrder1=QincidenceEntity.IncidenceEntity.IDincidenceia.asc();
OrderSpecifier sortOrder2=QIncidenciasEntity.Incidencity.tiposIncidencias().idTipoIncidencia.asc();
QSort QSort=新的QSort(sortOrder1,sortOrder2);
返回事件报告findAll(新QPageRequest(paginaMas1-1,numIncidencias,qsort));
}
方法1产生错误:找不到类型IncidenceEntity的属性idTipoIncidencia

方法2(没有QueryDSL,只有Spring数据JPA):

public Page obtenerpaginaincidenciasordenypaginacionical(intpaginamas1,
int numIncidencias)
{
订单标准ENACION1=新订单(Direction.ASC,“idicidencia”);
订单标准DENACION2=新订单(Direction.ASC,“tiposincidencia.idTipoIncidencia”);
Sort criteriordenacionmixto=新排序(criteriordenacion1,criteriordenacion2);
返回发生率CIASREPO.findAll(
新的页面请求(paginaMas1-1、numIncidencias、CriteriordenacionMixto);
}
方法2没有显示任何错误,但没有按照我所希望的按字段idTipoIncidencia排序


注意:我不想让它只在QueryDSL中工作,我想让它无论如何工作,即使是在jpa存储库中。

如果您的存储库扩展了
分页和排序存储库
,只需
findAll(新页面请求(页面、大小、新排序(“idIncidencia”、“tiposIncidencias”))
就足够了
idIncidencia
将转换为
ID\u INCIDENCIA
列,
TiposIncidencia
将自动转换为
ID\u TIPO\u INCIDENCIA

我用您的代码创建了一个示例,通过对
findAll
的简单调用,演示了正确的排序顺序。该示例包含一个单元测试,该测试向表中添加一些记录,按所需的排序顺序检索它们,然后检查它们是否按所需的顺序返回

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));
    }