Postgresql 具有部分复合id的Hibernate Criteriabuilder查询
我有一个试图通过“userid”查询的类 身份证类别Postgresql 具有部分复合id的Hibernate Criteriabuilder查询,postgresql,hibernate,criteriaquery,Postgresql,Hibernate,Criteriaquery,我有一个试图通过“userid”查询的类 身份证类别 public class CollectionPK implements Serializable{ private int userId; private int cardId; public CollectionPK() { } ... 查询代码为 public List<Collection> readCollection(int id) { List<Collection> collec
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();
}
...
理想的查询是
从集合中选择*,其中userid='userid'
如何修改以使其工作
可以肯定的是,错误出现在criteria builder部分的session.save()中。session.get()和session.delete()都能正常工作
更新:
做了一点测试,问题的原因肯定是root.get(“userid”)有没有办法检查hibernate对类有哪些属性
更新2:
将root.get(“userId”)中的I大写可以修复该错误。但是,这两种形式仍然会在query.setParameter(“userId”,id)处导致错误
更新3:
弄明白了,或者至少让它起作用了。Hibernate在后台重命名东西。通过打印所有内容以找到正确的参数名称来解决此问题
for(Parameter<?> p:query.getParameters()) {
System.out.println(p.getName());
}
System.out.println(query.getParameters().size());
for(参数p:query.getParameters()){
System.out.println(p.getName());
}
System.out.println(query.getParameters().size());
尝试用以下方式更正您的查询:
CriteriaBuilder=session.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=builder.createQuery(Collection.class);
Root=criteriaQuery.from(Collection.class);
ParameterExpression userIdParameter=builder.parameter(Integer.class);
其中(builder.equal(root.get(“userid”),userIdParameter));
列表集合=session.createQuery(criteriaQuery)
.setParameter(“用户id”,id)
.getResultList();
另请参见文档的第页。可能是必要的更新,但不会导致此错误。做了一点测试,它肯定是root.get(“userid”)你得到了什么错误?您是否有用于
userid
字段的getter?与上面的dard getter/setter错误相同。尝试了几种不同的大写形式public int getUserId(){return userId;}public void setUserId(int userId){this.userId=userId;}
Exception in thread "main" java.lang.IllegalArgumentException: Unable to locate Attribute with the the given name [userid] on this ManagedType [com.panda.userinfo.Collection]
java.lang.IllegalArgumentException: Unable to locate parameter registered with that name [userId]
for(Parameter<?> p:query.getParameters()) {
System.out.println(p.getName());
}
System.out.println(query.getParameters().size());