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

标签 java hibernate join annotations hql

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

相关文章:

java - Hibernate不创建表

spring - HibernateException 缺少表

mysql - 计算一个值在表的任何列中的出现次数

php - MySQL 不使用 INNER JOIN 在单独的表中显示重复的列名

SQL Server SELECT 与 JOIN 分页

java - S3Client的生命周期是多少

java - 当 XML 中有多个命名空间时,如何 getChildText() 具有命名空间的节点?

java - 参照完整性约束违规 : when deleting Entity in Hibernate (H2 in memory DBMS)

java - MVC 模式的哪一层从数据库加载数据/将数据保存到数据库?

java - 在 JPasswordField 上设置 PlaceHolder