簡體   English   中英

JPQL查詢中的靜態工廠方法而不是構造函數

[英]Static Factory Method in JPQL query instead of constructor

目前我使用了很多查詢,這些查詢使用構造函數在JPQL中構建值對象,如下所示

@Query("SELECT new com.DocDTO(d.documentId, d.docType) FROM Document d where d.parentId=:parentId")
Set<DocDTO> getDocsWithinFolder(@Param("parentId") Long parentId);

但是隨着代碼變得復雜,我需要使用構造函數參數的各種組合來構建對象,從而導致經典的伸縮問題。

正如Effective Java (Item1)所解釋的,有一種方法可以通過傳遞工廠方法而不是構造函數來構建JPQL查詢嗎? 我正在思考一些事情

  @Query("SELECT DocDTO.query1(d.documentId, d.docType) FROM Document d where d.parentId=:parentId")
    Set<DocDTO> getDocsWithinFolder(@Param("parentId") Long parentId);

然后在DocDTO類中構建適當的靜態工廠方法query1 這在JPQL中是否可行?

您可以使用Dynamic projection來解決此問題。 動態投影允許您動態更改單個查詢的返回類型。 為了更好地理解這一點,我們舉一個這個用戶實體的例子:

    @Entity
    public class User {
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private Long id;
        private String firstName;
        private String lastName;
        private String email;
        // setter and getters
}

如果您想首先使用動態投影獲取用戶名,則需要創建如下界面:

public interface Name {
      String getLastName();
      String getFirstName();
}

在您的存儲庫中,您需要創建如下查詢:

<T> List<T> findByLastName(String lastName, Class<T> type);

或者使用@Query

@Query("select u.firstName,u.lastName from User u where lastName=?1")
<T> List<T> findByLastName(String lastName,Class<T> type);

在您的服務中:

List<Name> name = findByLastName("xyz",Name.class);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM