hibernate 选择具有给定属性的集合元素

标签 hibernate hql

实体Project有收藏属性contributors@OneToMany 映射与实体的关系 User

@Entity
@Table( name = "projects" )
public class Project {
    ...

    @OneToMany
    @JoinTable(name = "project_contributors")
    private List<User> contributors = new ArrayList<User>();

    ...
}

然后我需要检查是否 contributors已经有 userid contributorId在添加之前。我正在尝试使用 HQL 查询,但我显然非常无能。

我在尝试什么:
Query query = session.createQuery(
        "select p.contributors from Project p where p.id = :pId and p.contributors.id = :cId"
    );

query.setParameter("pId", projectId);
query.setParameter("cId", contributorId);

@SuppressWarnings("unchecked")
List<User> res = (List<User>) query.list();

但它给出了错误
illegal attempt to dereference collection [project0_.id.contributors] with element property reference [id]

有没有好心人愿意给我一点插入?

我做的另一个尝试是
"select p.contributors as c from Project p where p.id = :pId and c.id = :cId"

但没什么。

最佳答案

contributors是一个集合。因此,它没有名为 id 的属性。

Id 是此 Collection 元素的属性。

您可以通过加入集合而不是取消引用来解决问题:

SELECT p 
  FROM Project pj 
  JOIN pj.contributors  p 
 WHERE pj.id       = :pId
   AND p.Id     = :cId

关于 hibernate 选择具有给定属性的集合元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37734177/

相关文章:

java - Spring+Hibernate+Cassandra的组合如何运行

sql - Hive - 将 Int 转换为 varchar 并连接

java - 为什么 Hibernate 会为此 HQL 抛出 QuerySyntaxException?

java - Hibernate 抛出 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException : check the manual for the right syntax to use near 'localTime' time

hibernate - 如何在 Grails 中管理对象修订?

java - 使用 hibernate 管理多对多关系

java - 延迟加载对象集合以使用 HQL 插入

sql - 在 varchar 列中进行数字比较

java - org.hibernate.hql.internal.ast.ErrorCounter : unexpected token: (

hibernate - 在 Hibernate 中指定同一类对象之间的双向关系