Исключение гибернации «не удалось разрешить свойство» при выполнении запроса с критериями и ограничениями - PullRequest
5 голосов
/ 24 мая 2011

У меня есть отношение 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 
}

Столбец group_id находится в таблице пользователей.
Вызов методов Group.getUsers() и User.getGroup() работает нормально. Но мне также нужно сделать запрос после столбца group_id:

Criteria criteria = Activator.getDefault().getSQLSession().createCriteria(User.class);
Criterion c = Restrictions.eq("group_id", 1); // an id of a group
criteria.add(c);

Объект Criterion создается в методе и может быть для других таблиц "один ко многим" или может содержать другие столбцы, поэтому я не могу использовать метод getUsers().

К сожалению, приведенный выше код дает следующее исключение:

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 ...

В чем может быть проблема?


Edit:

После изменения, которое 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;
    }
}

Я тоже пытался с long id, но это та же ошибка.


Редактировать 2:

После долгих копаний выглядит, что объект Criterion должен получить групповой объект в качестве параметра, а не идентификатор: Restrictions.eq("group", {A_GROUP_OBJECT});

Возможно ли, что я отправлю туда идентификатор?

Ответы [ 3 ]

4 голосов
/ 24 мая 2011

Это похоже на работу:

Criterion c = Restrictions.eq("group.id", 1); // an id of a group
4 голосов
/ 24 мая 2011

ваш столбец group_id , и вам следует использовать свойство, которое group ... Критерий c = Restrictions.eq (" group ", 1);// идентификатор группы ...

2 голосов
/ 24 мая 2011

Если вы используете oracle в качестве базы данных, причина может быть в том, что group_id является ключевым словом в нем. Измените имя на другое и попробуйте.

...