2016-04-22 66 views
0

我正在努力尋找關於如何查詢我的模型中更復雜的屬性的任何類型的文檔。通過@embeddedID的「查詢創建」方法構建Spring數據JPA查詢

比如我有

public class MyEmbedded{ 
@EmbeddedID 
private MyEmbeddedPK embeddedPK; 
} 

@Embeddable 
public class MyEmbeddedPK{ 

    private Integer age; 

    private Integer zip;  
} 

在我的倉庫,我實現CrudRepository和會期望能夠做到

public List<MyEmbedded> findByageAndZip(String age, String zip); 

但是,這似乎並沒有工作。這些文檔並沒有真正說出有關@ EmbeddedId的任何內容。查詢@OneToMany屬性也一樣,我從來沒有發現任何東西。

我正在引用文檔。 http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-keywords

有沒有關於如何創建這個查詢的更好的文檔?

回答

1

我想我找到了我的答案,奇怪的是它在文檔中,但我只是沒有拿起它。你只需要通過駱駝案件將這些屬性組合在一起。我可以發誓我嘗試了這一點,但顯然我有我的情況搞砸了。

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-property-expressions

第4.4.3節。屬性表達式

但是,您還可以通過遍歷嵌套屬性來定義約束。假設一個人有一個ZipCode的地址。在這種情況下,方法名稱爲

List findByAddressZipCode(ZipCode zipCode);

創建屬性遍歷x.address.zipCode。解析算法首先將整個部分(AddressZipCode)解釋爲屬性,然後檢查域類是否具有該名稱的屬性(未包含大小)。如果算法成功,則使用該屬性。如果不是這樣,該算法將來自右側的駱駝案件部分的來源拆分爲頭部和尾部,並嘗試查找相應的屬性,在我們的示例AddressZip和Code中。如果算法找到具有該頭部的屬性,它將採用尾部並繼續從那裏構建樹,然後按照剛剛描述的方式分割尾部。如果第一次拆分不匹配,則算法將拆分點移到左側(地址,ZipCode)並繼續。

1

我不確定Spring Data Jpa是否支持這個功能,並且它基於嵌入的id屬性進行查詢似乎有點複雜,因爲它可以同樣適用於封閉實體本身的狀態字段。但是,這可以很容易地與JP QL與Query和@Param指定它實現

@Query("SELECT m FROM MyEmbedded m WHERE m.embeddedPK.age = :age AND m.embeddedPK.zip = :zip") 
public List<MyEmbedded> findByageAndZip(@Param("age") String age, @Param("zip") String zip); 

而且不要忘了用下面的簽名春數據運行指定庫需要知道的實際類型的ID類。

@Repository 
public interface MyEmbeddedRepository extends CrudRepository<MyEmbedded, MyEmbeddedPK> {..}