2016-12-09 25 views
1

我使用Spring 4.1.6和QueryDSL 3.7.4。春季查詢dsl:如何按兩個數據庫字段排序,其中一個是外鍵?

我用Telosys工具創建了我的實體,我的QueryDSL實體創建了the apt-maven-plugin

我沒用過的@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)); 
    } 

方法1產生錯誤:沒有財產idTipoIncidencia發現型IncidenciasEntity!

方法2(無QueryDSL,只是春季數據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存儲庫。

回答

1

如果您的存儲庫擴展爲PagingAndSortingRepository,則只需findAll(new PageRequest(page, size, new Sort("idIncidencia", "tiposIncidencias")))就足夠了。 idIncidencia將轉換爲ID_INCIDENCIA列,tiposIncidencias將自動轉換爲ID_TIPO_INCIDENCIA列。

我用您的代碼創建了一個sample application,該代碼通過簡單調用findAll來演示正確的排序順序。該示例包含一個單元測試,它向表中添加一些記錄,按照所需的排序順序檢索它們,然後檢查它們是否按照所需的順序實際返回。

相關問題