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?
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas besoin de la carte de l'utilisateur-table de groupe, il suffit de définir votre relation entre l'Utilisateur et de Groupe de plusieurs-à-plusieurs, de relation, de prendre un coup d'oeil à cette et cette sur la façon de mapper plusieurs-à-plusieurs relations.
Dans votre cas, il ressemblera à:
Et de filtrer vos utilisateurs en utilisant le champ nom de l'entité du Groupe par exemple:
La façon dont vous carte votre objet de tables de ne pas bénéficier de l'utilisation de Hibernate comme ORM. Un modèle orienté-objet, par exemple:
Donc, vous avez un classique de type plusieurs-à-plusieurs association. Ici vous pouvez trouver un exemple de cette mise en correspondance avec la veille prolongée.