所以我有 2 个表,一个包含姓名的人员表和一个包含引用此人的昵称的 nick_name 表。每个人可能有 0 个、1 个或多个昵称。
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", joinColumns=@JoinColumn(name="ID_FK"))
@Column(name="NICK_NAME")
private List<String> nickNames;
//other stuff
}
我想,给定一个名字,检索所有拥有该名字或昵称的人。也就是说,如果一个名为“Robert”的人有昵称“Bobby”和“Bob”,我希望这三个人都能够检索到他。
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
执行此操作的正确方法是什么?
最佳答案
您不能对集合执行此操作
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);
关于java - 带注释的 Hibernate-如何从连接列表中进行选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34230936/