Hibernate Jointures à l'aide des Critères

Je suis en train d'utiliser Hibernate pour accéder à des données persistantes pour nos droits de gestion, mais je suis très nouveau pour elle et de la difficulté à obtenir les données dont j'ai besoin.

J'ai les Utilisateurs de tableau, avec un ID et un nom, un des Groupes de la table avec un ID et un nom, et un nom d'Utilisateur/Groupes de cartographie qui est l'id de groupe et l'id d'utilisateur qui sont liés.

Ce que je veux faire est d'obtenir tous les noms des membres d'un groupe donné, de sorte que la requête SQL standard je tiens à exécuter est: est-ce

SELECT 
    u.NAME
FROM 
    USERS u
JOIN
    GROUP_USERS gu
ON
    u.ID = gu.USER_ID
JOIN
    GROUPS g
ON
    gu.GROUP_ID = g.ID
WHERE
     g.NAME = 'test'

Mais malgré des heures de recherche et de lecture, je n'arrive pas à aller n'importe où.

Je veux utiliser des Critères comme ils semblent plus claires, de sorte que mon code est comme suit:

@Override
public final List<String> getGroupMembers(final String groupName) {
    @SuppressWarnings("unchecked")
    List<User> groupUsers = getHibernateTemplate().execute(new HibernateCallback<List<User>>() {

                @Override
                public List<User> doInHibernate(Session session) throws HibernateException, SQLException {
                    Criteria criteria = session.createCriteria(User.class)
                        .setFetchMode("GroupUsers", FetchMode.JOIN)
                        .setFetchMode("Group", FetchMode.JOIN)
                        .add(Restrictions.eq("name", groupName));
                    return criteria.list();
                }
            });

    List<String> groupUsernames = new ArrayList<String>();
    for (User groupUser : groupUsers) {
        groupUsernames.add(groupUser.getName());
    }
    return groupUsernames;
}

Mais quand je l'ai tester le jeu de résultats est vide, et selon les journaux de la requête exécutée est-ce:

select this_.ID as M1_4_0_, this_.NAME as M2_4_0_ from USERS this_ where this_.NAME=?

Je laisser Hibernate créer les tables de l'utilisation d'hibernate.hbm2ddl.auto, mais ensuite enlevé de sorte que les tables sont certainement que la mise en veille s'attend, mais les données n'est pas nettoyé.

Toute aide avec les Critères serait grandement appréciée, merci d'avance!

Edit: je suis en utilisant le mappage xml fichiers:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.company">
    <class name="com.company.Group" table="GROUPS">
        <id name="id" column="ID" type="int">
            <generator class="identity"/>
        </id>
        <property name="name" column="NAME" type="java.lang.String" unique="true" not-null="true"/>
    </class>
</hibernate-mapping>

et

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.company">
    <class name="com.company.GroupUsers" table="GROUP_USERS">
        <composite-id>
            <key-many-to-one name="groupId" class = "Group" column="GROUP_ID" />
            <key-many-to-one name="userId" class = "User" column="USER_ID" />
        </composite-id>
    </class>
</hibernate-mapping>

et

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.company">
    <class name="com.company.User" table="USERS">
        <id name="id" column="ID" type="int">
            <generator class="identity"/>
        </id>
        <property name="name" column="NAME" type="java.lang.String" unique="true" not-null="true"/>
    </class>
</hibernate-mapping>
  • Vous appliquez le filtre "nom" sur l'Entité User. Vous pouvez poster votre mappages de voir comment avez-vous décrire vos relations avec les Hibernate annotations?
  • Merci pour la réponse, j'ai ajouté les fichiers de mappage. Comment aurais-je mis sur la récupération des noms d'utilisateur, mais le filtrage sur le nom du groupe alors?
InformationsquelleAutor m0rv4i | 2012-09-03