gpt4 book ai didi

java - 带注释的 Hibernate-如何从连接列表中进行选择?

转载 作者:行者123 更新时间:2023-12-01 10:45:02 25 4
gpt4 key购买 nike

所以我有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com