Java Hibernate critères.setResultTransformer() initialise les champs de modèle avec des valeurs par défaut
Je suis nouveau sur mise en veille prolongée et je suis en train d'essayer d'obtenir certaines données de la base de données. Je ne veux pas toutes les données mais une projection d'une entité.
La chose est que, dans la boucle for, quand je reçois l'id et le nom de ma projection, on obtient les valeurs par défaut id=0 et nom=null au lieu de id=7 et name="Nom de 8" qui sont les enregistrements de l'entité d'origine dans la base de données. Savez-vous quelles sont les causes de ce problème?
La boucle for est dans le dernier code.
Ici est l'Élève de l'Entité
@Entity(name = "Students")
public class Student {
@Id
@GeneratedValue
@Column(name = "StudentId")
private int id;
@Column(name = "Name", nullable = false, length = 50)
private String name;
@Column(name = "Grade")
private Double grade = null;
@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "FacultyId", nullable = false)
private Faculty faculty;
@ManyToMany(cascade = CascadeType.PERSIST)
@JoinTable(
joinColumns = @JoinColumn(name = "StudentId"),
inverseJoinColumns = @JoinColumn(name = "CourseId"))
private Collection<Course> courses;
public Student() {
this.courses = new HashSet<Course>();
}
//Setters and Getters for all fields
}
Ici est la StudentModel
public class StudentModel {
private int id;
private String name;
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
Et le code je suis d'exécution
Session session = sessionFactory.openSession();
session.beginTransaction();
{
Criteria criteria = session.createCriteria(Student.class);
criteria.add(Restrictions.eq("name", "Name 8"))
.setProjection(
Projections.projectionList()
.add(Projections.property("id"))
.add(Projections.property("name")))
.setResultTransformer(
Transformers.aliasToBean(StudentModel.class));
@SuppressWarnings("unchecked")
List<StudentModel> students = criteria.list();
for (StudentModel student : students) {
System.out.println(student.getId());
System.out.println(student.getName());
}
session.getTransaction().commit();
session.close();
}
OriginalL'auteur Denis Rizov | 2013-10-28
Vous devez vous connecter pour publier un commentaire.
Vous avez probablement tout simplement oublié d'attribuer des alias pour vos projections:
Vous avez sauvé ma vie!!! Merci
OriginalL'auteur JB Nizet
En outre, et pour répondre à @Ram commentaire :
"id" et "nom" de Java champ nom de l'Élève de la classe, mais dans votre base de données, ils sont nommés "StudentId" et "Nom", d'ailleurs hibernate générer la requête SQL avec un alias pour éviter les conflits de nom, donc dans le jeu de résultats il n'y a pas de "id" et la colonne "nom".
Le deuxième paramètre dans l'exemple ci-dessus vigueur le nom d'alias.
Hibernate générer SQL comme ça :
Vous pouvez dire à hibernate d'affichage généré la requête SQL dans la console/le journal par la mise en
hibernate.show_sql
à true dans le fichier de configuration Hibernatehibernate.cfg.xml
.OriginalL'auteur Thomas Champion