Hibernate Criteriabuilder Query with part of a complex id

Posted

技术标签:

【中文标题】Hibernate Criteriabuilder Query with part of a complex id【英文标题】:Hibernate Criteriabuilder Query with part of a compound id 【发布时间】:2021-04-01 05:12:10 【问题描述】:

我有一个类,我试图通过“userid”查询

@Entity
@IdClass(CollectionPK.class)
@Table(name="collection", schema="mageduelsusers")
public class Collection

@Id
@Column(name = "userid")
private int userId;

@Id
@Column(name = "cardid")
private int cardId;
...

Id 类

public class CollectionPK implements Serializable

private int userId;
private int cardId;

public CollectionPK() 
    

...

查询代码是

public List<Collection> readCollection(int id) 
    List<Collection> collection = null;
    Session session = factory.openSession();
    Transaction tx = null;
    try 
        tx = session.beginTransaction();
        
        CriteriaBuilder builder = session.getCriteriaBuilder();
        CriteriaQuery<Collection> criteriaQuery = builder.createQuery(Collection.class);
        Root<Collection> root = criteriaQuery.from(Collection.class);
        
        ParameterExpression userIdParameter = builder.parameter(Collection.class);
        
        criteriaQuery.where(builder.equal(root.get("userid"), userIdParameter));
        
        Query<Collection> query = session.createQuery(criteriaQuery);
        query.setParameter("userid", id);
        
        collection = query.getResultList();
        
        tx.commit();
    
...

错误是

Exception in thread "main" java.lang.IllegalArgumentException: Unable to locate Attribute  with the the given name [userid] on this ManagedType [com.panda.userinfo.Collection]

理想的查询是 Select * from collection where userid = 'userid';

我该如何修改才能使它工作?

相当肯定的错误是在标准构建器部分,如 session.save()。 session.get() 和 session.delete() 都可以正常工作

更新: 做了一点测试,问题的原因肯定是 root.get("userid") 有没有办法检查 Attributes hibernate 对一个类有什么?

更新2: 将 root.get("userId") 中的 I 大写可修复该错误。但是,这两种形式仍然会导致 query.setParameter("userId", id) 出现错误

 java.lang.IllegalArgumentException: Unable to locate parameter registered with that name [userId]

更新 3: 想通了,或者至少让它发挥作用。 Hibernate 在后台重命名事物。通过打印所有内容以找到正确的参数名称来解决。

for(Parameter<?> p:query.getParameters()) 
    System.out.println(p.getName());
 
 System.out.println(query.getParameters().size());

【问题讨论】:

【参考方案1】:

尝试以这种方式更正您的查询:

CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Collection> criteriaQuery = builder.createQuery(Collection.class);
Root<Collection> root = criteriaQuery.from(Collection.class);
        
ParameterExpression<Integer> userIdParameter = builder.parameter(Integer.class);
        
criteriaQuery.where(builder.equal(root.get("userid"), userIdParameter));
        
List<Collection> collection = session.createQuery(criteriaQuery)
   .setParameter("userid", id)
   .getResultList();

另请参阅文档的this section。

【讨论】:

可能是必要的更新,但不会导致此错误。做了一些测试,它肯定是 root.get("userid") 你遇到了什么错误?你有 userid 字段的吸气剂吗? 标准获取器/设置器。尝试了几种不同的大小写 public int getUserId() return userId; public void setUserId(int userId) this.userId = userId;

以上是关于Hibernate Criteriabuilder Query with part of a complex id的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate CriteriaBuilder 加入多个表

Hibernate CriteriaBuilder - 如何匹配具有相同字段的所有元素,其中 id 相同

将String传递给String 对于使用Hibernate的CriteriaBuilder.equal方法

Hibernate Criteriabuilder Query with part of a complex id

JPA CriteriaBuilder in条件构建问题

如何告诉 JPA CriteriaBuilder 按返回的唯一数据列排序?