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方法