2016-12-05 11 views
0

親クラスを動作しません。JPQLは適切

@Table(name = "users") 
class User { 
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
List<Gender> genders = new ArrayList<>(); 

子供クラス:MySQLで

@Table(name = "gender") 
class Gender { 
@ManyToOne(cascade = {CascadeType.ALL}) 
@JoinColumn(name = "userId", nullable = false) 
User user; 
String sex; 

私の目標:

SELECT *ユーザーからの左がON性別bを登録しよう.id = b.id WHERE b.sex = 'dasd'

戻り値1 ROW 正常に動作します。この条件を満たすレコードは1つだけです。

が、JPQLで同じコード: - 正しくALL 1つのユーザー:

ユーザーからのLEFTを選択はb.sex = 'DASD'

返しa.genders bを登録しようジェンダーのテーブルジェンダーでは、私はほしいと思うが、私はsex = 'dasd'とこの条件を満たすレコードが1つしかない場合にのみ欲しい。JPQLはN+1 issueを生成し、すべてのサブクエリに対してcondtion sex = 'dasd'を無視してほしい。

書きます条件を満たすサブクエリ? JPQLクエリと一致するジェンダーのみを強制的に返すようにサブクエリを強制できますか?あなたはエンティティではないテーブルから選択JPQLで

+0

ジェンダーエンティティコードを入力できますか? –

+0

Gender.java(子) – user3871754

答えて

3

SELECT a FROM User a LEFT JOIN a.genders b WHERE b.sex ='dasd' 

あなたはEAGERとしてa.gendersリストを構成しているので、あなたがユーザーを選択するたびに、それはユーザーがにasociatedされるすべての性別を取得します。たとえJPQLクエリと一致しなくても。

あなたLAZYとして設定a.gendersリストをした場合、それは文句を言わないあなたはユーザー

からのみ選ばので、あなたが唯一の選択したい場合は、そのクエリは、SQL

SELECT a.* FROM users a LEFT JOIN genders b ON a.id=b.id WHERE b.sex='dasd' 

に相当し、いずれかの性別を取得ワンジェンダー

SELECT b FROM Gender b WHERE b.user = :user AND b.sex = 'dasd' 
+0

ユーザーを選択するたびに、ユーザーが関連付けられているすべての性別を取得します。たとえJPQLクエリと一致しなくても。はい、これは問題です。 JPQLクエリと一致するジェンダーのみを返すように強制できますか? – user3871754

+0

問題は、あなたがジェンダーを選択しておらず、ユーザーを選択しているということです。 EAGERを使用すると、gendersコレクションは完全なコレクションで初期化されます。 LAZYを使うと、必要に応じて(もし 'a.getGenders()'を実行した場合)、コレクション全体を取得するプロキシでgenderのコレクションが初期化されます。 1つの性別を選択する方法の回答を編集しました。 – chalailama

+0

よろしくお願いします。私は特別なクエリをしたくない – user3871754