Hibernate标准生成器使用部分复合id进行查询



我有一个类,我正试图通过"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]

理想的查询是从集合中选择*,其中userid='userid';

如何修改以使其工作?

由于session.save((、session.get((和session.delete((都能正常工作,因此标准生成器部分中肯定存在错误

更新:做了一点测试,问题的原因肯定是root.get("userid"(有什么方法可以检查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());

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

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();

另请参阅本节文档。

最新更新