2016-04-28 6 views
0

は、私は、Java永続エンティティ表については、以下の構造を有する:Spring @Queryを要素のコレクションと共に使用して、2つのテーブル間で正しい結合を行うにはどうすればよいですか?

@Entity 
@Table 
public class Product { 

    @Id 
    private String id; 

    @Column 
    private String name; 

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    private List<Price> prices; 

    // getters and setters 
} 


@Entity 
@Table 
public class Price { 

    @Id 
    private String id; 

    @Column 
    private Float value; 

    @Column 
    private Strung type; 

    // getters and setters 
} 

データベースはHQLです。テーブルは自動的に作成されているので、私は3つのテーブルで、この構造を持っている:

CREATE MEMORY TABLE PRODUCT (ID VARCHAR(255) NOT NULL PRIMARY KEY, NAME VARCHAR(255)) 
CREATE MEMORY TABLE PRICE (ID VARCHAR(255) NOT NULL PRIMARY KEY, VALUE DOUBLE, TYPE VARCHAR(255)) 
CREATE MEMORY TABLE PRODUCT_PRICE (PRODUCT_ID VARCHAR(255) NOT NULL, PRICES_ID VARCHAR(255) NOT NULL, CONSTRAINT FK_SJ093JT9KRVI6PN4LQBDO30FU FOREIGN KEY(PRICES_ID) REFERENCES PRICE(ID),CONSTRAINT FK_H70YJF4SF4ABLK7MSXXV648Q9 FOREIGN KEY(PRODUCT_ID) REFERENCES PRODUCT(ID),CONSTRAINT UK_QJ093JT9KRVI4PN2LQBDO30FU UNIQUE(PRICES_ID)) 

「中間」テーブルPRODUCT_PRICEはわずか2つのフィールド(PRODUCTと価格の間に参加させるためのID)を含んでいます。

はここにいくつかの例の件のデータがあります。

INSERT INTO PRODUCT ('PRD001','Product 1'); 
INSERT INTO PRICE ('PRC001', 1000, 'euro'); 
INSERT INTO PRICE ('PRC002', 50, 'tax'); 
INSERT INTO PRODUCT_PRICE ('PRD001','PRC001'); 
INSERT INTO PRODUCT_PRICE ('PRD001','PRC002'); 

私はすべての製品とその価格タイプ=「ユーロ」を検索するJPAリポジトリに問い合わせを行う必要があります。

私のようなもので、春@queryを使用したい:

@Query("select p from Product p where p.prices.type = 'euro'") 

どのように私は正しいが参加することができますか?私のサンプルクエリは、Hibernate Exceptionを生成します。

ありがとうございました。

答えて

1

クエリにjoin句を追加するだけです。

@Query("SELECT p FROM Product p JOIN p.prices pr WHERE pr.type = 'euro'")

しかし、あなたはすでに春のデータを使用しているとして、私はアドバイス照会メソッドを使用しての代わりに、このような単純なケースのためのカスタム文を書きます。

+0

であり、これを試してみてください必要!それは完全に動作します!ありがとう。 –

0

はええ、それはまさに私だ@query注釈Uについては

マイコード

List<User> findAllByAuthorities(Authority authority); 

せずに、あなたは価格オブジェクトを渡すタイプは 'ユーロ'

List<Product> findProductsByPrices(Price price); 
+0

あなたの提案に感謝しますが、私の例ではいくつかのフィールドしか報告しません。私の目的は、1つ以上のフィールドで複雑なクエリを作成しているため、クエリアノテーションが必要であり、単一の「find ...()」メソッドが必要ではありません。 –

+0

Springデータクエリメソッドを使用すると、複雑なクエリも作成できます。 JPQLを書くのではなく、いつも私が現在好きな方法です。 http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation – Vaelyr

関連する問題