2016-04-11 6 views
0

問題文:Countryは、Stateとのコレクション関係を持っています。国家を取得して、それに関連するすべての州を取得する。多くの場合、望ましいことです。今の場合、私は国番号idと状態idを持っています。状態IDで国フィルタリングを取得すると、StateCountryに得ることは可能ですか?Java Hibernate Collection Mapping:特定のコレクション値をフィルタリングしない

Country.class

@Entity 
@Repository 
@Table(name="COUNTRY") 
class Country implements Serializable{ 

@Id 
@GeneratedValue(startegy=GenerationType.AUTO) 
private long id; 

@OneToMany(mappedBy="country", cascade={javax.persistence.CascadeType.ALL}, fetch=FetchType.EAGER) 
private java.util.Set<State> states; 
//Getters and setters 


} 

State.class

@Entity 
@Repository 
@Table(name="STATE") 
class State implements Serializable{ 

@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(name="id", nullable=false, unique=true, updatable=true) 
private long @Id 

@ManyToOne 
@JoinColumn(name="id") 
private Country country; 

//Getter and setter 
} 

私は次のクエリを試してみました:

//This query works great when used in SQL editor. Getting one state  
select * from country left join state ON country.id = state.id and state.id=3 
//Tried following 
    setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 

は、SQLクエリと作成した基準を超える使用し、しかし、私は得るすべての州。またはこの問題は解決できますか?私たちはより良い選択肢を持っていますか?

答えて

1

これは、JPAの動作を意図したものではありません。エンティティの変更を追跡する際に問題が発生します(JPAプロバイダは、欠落している状態がコレクションから削除されたと考えるかもしれません)。

しかし、Hibernateは@Filter@FilterDefを使ってこれをサポートしています。this threadを見てください。この例で使用されているコードは次のとおりです。

@Entity 
public class A implements Serializable{ 
    @Id 
    @Column(name = "REF") 
    private int ref; 

    @OneToMany 
    @JoinColumn(name = "A_REF", referencedColumnName = "REF") 
    @Filter(name="test") 
    private Set<B> bs; 
} 

@Entity 
@FilterDef(name="test", defaultCondition="other = 123") 
public class B implements Serializable{ 
    @Id 
    @Column(name = "A_REF") 
    private int aRef; 

    @Id 
    @Column(name = "OTHER") 
    private int other; 
} 

Session session = entityManager.unwrap(Session.class); 
session.enableFilter("test"); 
A a = entityManager.find(A.class, new Integer(0)) 
a.getb().size() //Only contains b that are equals to 123 
関連する問題