微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Criteria and Restrictions进行查询时,休眠异常“无法解析属性”

如何解决使用Criteria and Restrictions进行查询时,休眠异常“无法解析属性”

| 我在休眠中定义了一个OnetoMany关系,如下所示:
@Entity
@Table(name = \"groups\")
public class Group extends BaseModel {// BaseModel defines id as @Id and @GeneratedValue

    @OnetoMany
    @JoinColumn(name = \"group_id\")
    private List<User> users;

    // other fields,getters and setters omitted 
}


@Entity
@Table(name = \"users\")
public class User extends BaseModel {

    @ManyToOne
    @JoinColumn(name = \"group_id\")
    private Group group;

    // other fields,getters and setters omitted 
}
table1列在users表中。 调用方法
Group.getUsers()
User.getGroup()
可以正常工作。但是我还需要在列“ 1”之后进行查询
Criteria criteria = Activator.getDefault().getsqlSession().createCriteria(User.class);
Criterion c = Restrictions.eq(\"group_id\",1); // an id of a group
criteria.add(c);
Criterion
对象是在方法中创建的,它可以用于其他一对多表或可以包含其他列,因此我无法使用方法method7ѭ。 不幸的是,上面的代码给出了以下异常:
org.hibernate.QueryException: Could not resolve property: group_id of: com.example.User
    at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:81)
    at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:75)
    at org.hibernate.persister.entity.AbstractEntityPersister.getSubclasspropertyTableNumber(AbstractEntityPersister.java:1482)
    at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:62)
    and so on ...
可能是什么问题呢? 编辑: 在user759837建议更改(
Criterion c = Restrictions.eq(\"group\",1);
)之后,当我调用
criteria.list()
时,出现以下错误消息:
Could not get a field value by reflection getter of com.example.Group.id
java.lang.IllegalArgumentException: Can not set java.lang.Long field com.example.BaseModel.id to java.lang.Long
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnkNown Source)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnkNown Source)
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnkNown Source)
    at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnkNown Source)
    at java.lang.reflect.Field.get(UnkNown Source)
    at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:59)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:227)
    at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3875)
    at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3583)
    at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:203)
    at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:242)
    at org.hibernate.type.EntityType.getIdentifier(EntityType.java:456)
    at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:130)
    ...
BaseModel类是
@MappedSuperclass
public abstract class BaseModel {

    @Id
    @GeneratedValue
    private Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}
我也尝试过用ѭ14but,但这是相同的错误。 编辑2: 经过大量挖掘,看起来ѭ6对象应该接收一个组对象作为参数,而不是id :: 16 我可以在那里发送一个ID吗?     

解决方法

您的列是group_id,您应该使用属性group ... 标准c = Restrictions.eq(\“ group \”,1); //群组的ID ...     ,这似乎可行:
Criterion c = Restrictions.eq(\"group.id\",1); // an id of a group
    ,如果您使用oracle作为数据库,则可能是group_id是其中的关键字,将名称更改为其他名称然后尝试。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。