[英]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.