2015-12-11 50 views
0

所以我有兩張桌子,一張人名錶和一張暱稱表,暱稱是指人。每個人可能有0個,1個或更多的暱稱。註釋的Hibernate-如何從聯接列表中選擇?

PERSON     NICK_NAME 
---------     --------- 
ID      ID_FK 
NAME      NICK_NAME 
//other stuff 

我的Hibernate對象是這樣的:

@Entity 
@Table(name="PERSON") 
public class Person{ 
     @Id 
     @Column(name="ID") 
     private String id; 

     @Column(name="NAME") 
     private String name; 

     @ElementCollection 
     @CollectionTable(name="NICK_NAME", [email protected](name="ID_FK")) 
     @Column(name="NICK_NAME") 
     private List<String> nickNames; 

     //other stuff 

} 

我想,給一個名字,檢索誰擁有這個名字或暱稱所有的人。也就是說,如果名爲「Robert」的人有暱稱「Bobby」和「Bob」,我希望所有3人都能找回他。

public List<Person> retrieveByName(String name){ 
     Session session = this.sessionFactory.getCurrentSession(); 
     Criteria criteria = session.createCriteria(Person.class, "person"); 
     criteria.setResultTransformer(Person.DISTINCT_ROOT_ENTITY); 

     Criterion mainName = Restrictions.eq("name", name); 
     Criterion nickName = Restrictions.eq("person.nickNames", name); 
     criteria.add(Restrictions.or(mainName, nickName)); 

     return criteria.list(); 
} 

但我在這裏得到一個SQL錯誤

java.sql.SQLException: Missing IN or OUT parameter 

什麼是做到這一點的正確方法?

回答

1

不能爲收藏

Criterion nickName = Restrictions.eq("person.nickNames", name); 

使用前你需要通過添加別名的標準來連接兩個表(PERSON和NICK_NAME)集合的限制做到這一點

Criterion mainName = Restrictions.eq("person.name", name); 
criteria.createAlias("person.nickNames", "personNickName", JoinType.LEFT.ordinal()); 
Criterion nickName = Restrictions.eq("personNickName.nickName", name); 

我不知道最後一行是因爲你沒有NickName持久性,可能是

Criterion nickName = Restrictions.eq("personNickName", name);