2009-02-06 18 views
1

J'ai un objet Utilisateur de classe. J'essaye de charger cet objet de la base de données en utilisant Hibernate. Mon instruction SQL est:Hibernate - Nouvelles colonnes d'une table jointe

SELECT 
    users.uid    AS uid, 
    users.deleted   AS deleted, 
    users.username   AS username, 
    users.passwd   AS passwd, 
    users.disabled   AS disabled, 
    users.lockout   AS lockout, 
    users.expires   AS expires, 
    data_firstname.value   AS firstname, 
    data_lastname.value  AS lastname 
FROM 
    ac_users as users 
LEFT JOIN 
    ac_userdef_data as data_firstname 
ON 
    users.uid = data_firstname.parentuid AND 
    data_firstname.fieldname like 'firstname' 
LEFT JOIN 
    ac_userdef_data as data_lastname 
ON 
    users.uid = data_lastname.parentuid AND 
    data_lastname.fieldname like 'lastname' 
WHERE 
    users.deleted = 0 

Ma correspondance pour la classe utilisateur est:

<class name="com.agetor.commons.security.User" table="ac_users"> 
    <id name="uid" column="uid" type="long" > 
     <generator class="native"/> 
    </id> 
    <property name="deleted" column="deleted" /> 
    <property name="username" column="username" /> 
    <property name="password" column="passwd" /> 
    <property name="firstname" column="firstname" /> 
    <property name="lastname" column="lastname" /> 
    <property name="disabled" column="disabled" /> 
    <property name="lockout" column="lockout" /> 
    <property name="expires" column="expires" />    
</class> 

Mon problème est que la table ac_users ne dispose pas d'une colonne « prenom » ou « nom » Ces colonnes , n'existe que dans mon resultset à partir de l'instruction SQL-join. Ils n'existent pas non plus dans la table ac_userdef_data. Il y a 2 colonnes: fieldname et value. et 2 lignes: fieldname = « prenom » avec une valeur dans la colonne de valeur et une autre ligne avec fieldname = « lastname » avec une valeur dans la colonne Valeur

Comment puis-je changer mon fichier de mappage, de sorte que Hibernate comprendra qu'il doit charger la colonne prénom et nom dans mes champs prénom et nom de mon POJO, alors que ces colonnes n'existent pas réellement sur la table ac_users référencée.

Répondre

1

J'ai maintenant du code de travail. L'astuce consistait à spécifier une requête de chargement pour la classe User. Hibernate valide ensuite le retour de la requête au lieu du design de la table.

cartographie classe

<class name="com.agetor.commons.security.User" table="ac_users"> 
    <id name="uid" column="uid" type="long" > 
     <generator class="native"/> 
    </id> 
    <property name="deleted" column="deleted" /> 
    <property name="username" column="username" /> 
    <property name="password" column="passwd" /> 
    <property name="firstname" column="firstname" /> 
    <property name="lastname" column="lastname" /> 
    <property name="disabled" column="disabled" /> 
    <property name="lockout" column="lockout" /> 
    <property name="expires" column="expires" />     


    <loader query-ref="GetAllUsers" /> 
</class> 

Ma déclaration de requête

<sql-query name="GetAllUsers"> 
    <return alias="user" class="com.agetor.commons.security.User" /> 
    <![CDATA[ 
    SELECT 
     users.uid    AS uid, 
     users.deleted   AS deleted, 
     users.username   AS username, 
     users.passwd   AS passwd, 
     users.disabled   AS disabled, 
     users.lockout   AS lockout, 
     users.expires   AS expires, 
     data_firstname.value AS firstname, 
     data_lastname.value  AS lastname 
    FROM 
     ac_users as users 
    LEFT JOIN 
     ac_userdef_data as data_firstname 
    ON 
     users.uid = data_firstname.parentuid AND 
     data_firstname.fieldname like 'firstname' 
    LEFT JOIN 
     ac_userdef_data as data_lastname 
    ON 
     users.uid = data_lastname.parentuid AND 
     data_lastname.fieldname like 'lastname' 
    WHERE 
     users.deleted = 0 
    ]]> 
</sql-query> 

je devais utiliser la ligne <return alias="user" class="com.agetor.commons.security.User" /> de sorte que la collection retournée a été tapé correctement

+0

Cette réponse n'est pas correcte à 100%. Je peux charger des données en utilisant users = (Liste ) session.getNamedQuery ("GetAllUsers"). List(); Mais je ne peux pas utiliser users = session.createCriteria (User.class) .list(); – JesperGJensen