Hibernate exception " ne pourrait pas résoudre les problèmes de propriété lors d'une requête avec des Critères et des Restrictions
J'ai une relation OneToMany en veille prolongée définie comme ceci:
@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
}
Colonne group_id
est dans la table des utilisateurs.
L'appel de méthodes Group.getUsers()
et User.getGroup()
beau travail. Mais j'ai aussi besoin de faire une requête après la colonne 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);
La Criterion
objet est créé dans une méthode, et il peut l'être pour d'autres un-à-plusieurs tables ou peuvent contenir d'autres colonnes, donc je ne peux pas utiliser la méthode getUsers()
.
Malheureusement, le code ci-dessus donne l'exception suivante:
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 ...
Quel pourrait être le problème?
Edit:
Après le changement que user759837 suggéré (Criterion c = Restrictions.eq("group", 1);
), quand je l'appelle criteria.list()
, j'obtiens ce message d'erreur: 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)
...
La BaseModel classe est
@MappedSuperclass
public abstract class BaseModel {
@Id
@GeneratedValue
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
J'ai essayé avec long id
trop, mais c'est la même erreur.
Edit 2:
Après beaucoup de creuser, il semble que les Criterion
objet pour recevoir un groupe d'objet en tant que paramètre, pas un id: Restrictions.eq("group", {A_GROUP_OBJECT});
Pourrait-il être possible que je vous envoie-t-il une id?
OriginalL'auteur True Soft | 2011-05-23
Vous devez vous connecter pour publier un commentaire.
votre colonne est group_id et vous devez utiliser la propriété qui est groupe
...
Critère c = Restrictions.eq("groupe", 1); //l'id d'un groupe
...
OriginalL'auteur anfy2002us
Cela semble fonctionner:
je ne sais pas pourquoi, mais il aide =)
OriginalL'auteur True Soft
Si vous utilisez oracle DB, la raison pourrait être que group_id est un mot-clé.Changer le nom en quelque chose d'autre et l'essai.
group_id
. J'ai changé de sorte qu'il est plus clair.OriginalL'auteur Prasanna