2017-12-29 49 views
0

Hibernateクエリを作成して、特定のIDのエンティティを取得しようとしています。このエンティティは別のエンティティのコレクションを持っていますが、私は唯一のコレクションを移入するために非削除エンティティを取得したい:これはなぜ左の結合フェッチがエントリを取得しないのですか?

トップレベルのエンティティ:

@Entity 
@Table(name="rss_feed_definition") 
public class RSSFeedDefinition extends BaseEntity { 

    [...] 

    @OneToMany(mappedBy="rssFeedDefinitionId") 
    private Collection<RSSFeedProperty> rssFeedProperties; 

    [...] 

とHQL:

em.createQuery("from RSSFeedDefinition definition left join fetch definition.rssFeedProperties property where property.deleted = false and definition.id = :id"); 

RSSFeedDefinitionが返されないのはなぜですか?(これは削除済みのフラグがtrueです)

+0

あなたの 'where'句が結合されたテーブルをフィルタリングするためです。その条件を 'left join'に含める必要があります。 –

+0

申し訳ありませんが、エラーが表示されません。 – crm

答えて

0

私は、Hibernateの専門家ではないですが、純粋なSQLであなたの問題は、このです:参加を行うことができた場合にのみフィルタリングする

select * 
from RSSFeedDefinition definition 
left join property on definition.someField = property.otherField 
        and property.deleted = false 
where definition.id = :id 

:それはこのようにする必要があり

select * 
from RSSFeedDefinition definition 
left join property on definition.someField = property.otherField 
where property.deleted = false <--- this is the problem because it filters all data 
and definition.id = :id 

+0

これまでに収集したことから、JPAはフェッチのフィルタリングをサポートしていないようです。私が間違っていないならば、他の唯一の選択肢は2つのクエリでしょう。最初はトップレベルエンティティを取得し、2番目はトップレベルエンティティを取得します。 – crm

0

JPAは、JOIN FETCH文の条件をサポートしていません。しかし、あなたの場合には、次の回避策を使用することができます。

TypedQuery<RSSFeedDefinition> q = em.createQuery("SELECT definition FROM RSSFeedDefinition definition LEFT JOIN FETCH definition.rssFeedProperties property WHERE property.deleted = false or property.deleted = IS NULL and definition.id = :id", RSSFeedDefinition.class); 

を定義に関連付けられたプロパティが存在しない場合は、その属性がnullです。したがって、deletedfalsenullかどうかを確認する必要があります。

関連する問題