Hibernate - TypedQuery.getResultList() retourne une liste des le même objet

Ici est un plus et peut-être mieux qu'une description du problème:

Je fais une simple requête select. Le retour liste contient le nombre exact de dossiers/objets que si je fais la même requête dans la base de données, mais le problème est que tous les objets sont de la meme/identique.

Pour les anciens, c'est le résultat dans la base de données (j'ai enlevé les valeurs null):

26801 01-JAN-00 7 31-DÉC-99 7 Obere Kirchstr. 26 CH ch-8304 Walliselln

26801 01-JAN-00 2 31-DÉC-99 2 Obere Kirchstr. 26 CH ch-8304 Walliselln

Et c'est le contenu de la variable adresses que je peux le voir dans Eclipse pendant le débogage après que la requête a été exécutée:

adresses ArrayList (id=81)

elementData Objet[10] (id=86)

[0] DLDBAddress (id=82)

[1] DLDBAddress (id=82)

[2] null

...

modCount 1

taille 2

DLDBAddress [persid=26801, valPeriodStart=1900-01-01, valPeriodEnd=9999-12-31, addressNr=7, addressType=7, addressRow1=null, addressRow2=Obere Kirchstr. 26, addressRow3=null, pays=CH , code postal=8304, ville=Walliselln, phoneNr=null, faxNr=null, sekretaryPhoneNr=null, alternatPhoneNr=null, pagerNr=null]

DLDBAddress [persid=26801, valPeriodStart=1900-01-01, valPeriodEnd=9999-12-31, addressNr=7, addressType=7, addressRow1=null, addressRow2=Obere Kirchstr. 26, addressRow3=null, pays=CH , code postal=8304, ville=Walliselln, phoneNr=null, faxNr=null, sekretaryPhoneNr=null, alternatPhoneNr=null, pagerNr=null]]

Comme vous pouvez le voir, les deux objets sont identiques. Ils devraient plutôt diffèrent de la addressNr et addressType...

C'est le morceau de code où j'ai créer la requête:

public static <T> List<T> findBy(EntityManager eM, Class<T> boClass, String whereClause, String whereValue)  
 {
    EntityManager entityManager = eM;
    Query query = entityManager.createQuery("from " + boClass.getName() + " s where s." + whereClause + " = " + whereValue);
    ...
    return (List<T>) query.getResultList();
}

et c'est la (très simples) résultant de la requête:

à partir du ch.l'epf de zurich.id.wai.apb.bo.DLDBAddress s où s.persid = 26801

C'est la requête générée:

Hibernate: 
select
dldbaddres0_.PERSID as PERSID0_,
dldbaddres0_.ADRNUM as ADRNUM0_,
dldbaddres0_.ADRZEIL1 as ADRZEIL3_0_,
dldbaddres0_.ADRZEIL2 as ADRZEIL4_0_,
dldbaddres0_.ADRZEIL3 as ADRZEIL5_0_,
dldbaddres0_.ADRTYP as ADRTYP0_,
dldbaddres0_.ADRAUSWTEL as ADRAUSWTEL0_,
dldbaddres0_.ADRORT as ADRORT0_,
dldbaddres0_.ADRLAND as ADRLAND0_,
dldbaddres0_.ADRFAX as ADRFAX0_,
dldbaddres0_.ADRPSA as ADRPSA0_,
dldbaddres0_.ADRTEL as ADRTEL0_,
dldbaddres0_.ADRPLZ as ADRPLZ0_,
dldbaddres0_.ADRSEKTEL as ADRSEKTEL0_,
dldbaddres0_.BISDAT as BISDAT0_,
dldbaddres0_.VONDAT as VONDAT0_ 
from
NETHZ.V_DLDB_ADRESSE dldbaddres0_ 
where
dldbaddres0_.PERSID=26801

Et ici l'entité:

@Entity
@Table(name = "V_DLDB_ADRESSE", schema="NETHZ")
public class DLDBAddress
{
@Id
@Column(name = "PERSID", insertable = false, updatable = false)
private Integer   persid;
@Temporal(TemporalType.DATE)
@Column(name = "VONDAT", insertable = false, updatable = false)
private Date   valPeriodStart;
@Temporal(TemporalType.DATE)
@Column(name = "BISDAT", insertable = false, updatable = false)
private Date   valPeriodEnd;
@Column(name = "ADRNUM", insertable = false, updatable = false)
private Integer addressNr;
@Column(name = "ADRTYP", insertable = false, updatable = false)
private Integer addressType;
@Column(name = "ADRZEIL1", insertable = false, updatable = false)
private String addressRow1;
@Column(name = "ADRZEIL2", insertable = false, updatable = false)
private String addressRow2;
@Column(name = "ADRZEIL3", insertable = false, updatable = false)
private String addressRow3;
@Column(name = "ADRLAND", insertable = false, updatable = false)
private String country;
@Column(name = "ADRPLZ", insertable = false, updatable = false)
private String postalCode;
@Column(name = "ADRORT", insertable = false, updatable = false)
private String city;
@Column(name = "ADRTEL", insertable = false, updatable = false)
private String phoneNr;
@Column(name = "ADRFAX", insertable = false, updatable = false)
private String faxNr;
@Column(name = "ADRSEKTEL", insertable = false, updatable = false)
private String secretaryPhoneNr;
@Column(name = "ADRAUSWTEL", insertable = false, updatable = false)
private String alternatPhoneNr;
@Column(name = "ADRPSA", insertable = false, updatable = false)
private String pagerNr;
...

Suis-je raté quelque chose?

Ah, je me connecte à un serveur Oracle DB.

Merci d'avance
Francesco

  • 1. Je serais plus susceptibles d'utiliser les requêtes hql que CriteriaBuilder que les requêtes sont plus faciles à lire. 2. Sans voir la clause where passé à la méthode, il serait difficile de vous dire quel est le problème.
  • Dans mon expérience, en utilisant JPA & Hibernate EntityManager, ce qui se passe lorsque l'id n'est pas vraiment unique, qui est obligatoire dans l'APP. Hibernate EntityManager met pleinement en œuvre JPA 2, de sorte qu'il convient d'appliquer ici aussi. Vous le poster vos entités ainsi?
  • Quelle est la réelle SQL générées par Hibernate? Changer votre Hibernate pour montrer cette information. Que peut fournir une meilleure explication de ce qui va mal.
  • Erik vous avez eu raison. Dans ma classe, j'ai mis persid comme @Id, mais il n'est pas unique. J'ai défini un composite ID et maintenant ça fonctionne! Je vous remercie beaucoup.
  • Euh. Posté réponse pas remarqué que vous avez mentionné dans le commentaire que le problème est résolu. De toute façon, ma réponse peut aider à expliquer Hib du comportement.
InformationsquelleAutor Francesco | 2011-03-18