Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 具有部分复合id的Hibernate Criteriabuilder查询_Postgresql_Hibernate_Criteriaquery - Fatal编程技术网

Postgresql 具有部分复合id的Hibernate Criteriabuilder查询

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

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

身份证类别

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