Bonjour à tous,
Je rencontre un souci avec mon appli. Je développe avec Hibernate 3 et Spring.
J'ai trois tables : USER, SITE et USER_SITE.
Mon mapping est le suivant :
USER
Code:
<hibernate-mapping>
<class name="User" table="users">
<id name="id" type="integer">
<generator class="increment"/>
</id>
<property name="name">
<column name="name"/>
</property>
<set name="userSites" inverse="true" cascade="all-delete-orphan">
<key column="user"/>
<one-to-many class="UserSite"/>
</set>
</class>
</hibernate-mapping>
USER_SITE
Code:
<hibernate-mapping>
<class name="com.schneider.wum.dao.vo.WebVisitorSite" table="web_visitor_site">
<id name="id" type="int">
<generator class="increment"/>
</id>
<property name="validated">
<column name="validated"/>
</property>
<many-to-one name="site" class="Site">
<column name="site" sql-type="number"/>
</many-to-one>
<many-to-one name="user" class="User">
<column name="user"/>
</many-to-one>
</class>
</hibernate-mapping>
SITE
Code:
<hibernate-mapping>
<class name="com.schneider.wum.dao.vo.Site" table="sites">
<id name="id" type="integer">
<generator class="increment"/>
</id>
<property name="name">
<column name="name"/>
</property>
<set name="siteUsers" inverse="true" cascade="all-delete-orphan">
<key column="site"/>
<one-to-many class="UserSite"/>
</set>
</class>
</hibernate-mapping>
Je dois faire une recherche d'utilisateur par site et/ou par nom.
J'ai donc une méthode qui fait la recherche :
SearchUser
Code:
public List searchUser(Integer site, String name) {
List results = null;
Session session = getHibernateTemplate().getSessionFactory().openSession();
try {
Criteria criteria = session.createCriteria(User.class);
if (site != null){
criteria.createCriteria("userSites").createCriteria("site").add(Restrictions.eq("id", site));
}
if(name != null){
criteria.createCriteria("name").add(Restrictions.eq("name",name));
}
results= criteria.list();
Iterator iterator = results.iterator();
while (iterator.hasNext()){
User user = (User) iterator.next();
Hibernate.initialize(user.getUserSites());
Set userSites = user.getUserSites();
Iterator iteratorSites = userSites.iterator();
while (iteratorSites.hasNext()){
UserSite userSite = (UserSite) iteratorSites.next();
Hibernate.initialize(userSite.getSite());
}
}
}
catch( Exception e ) {
log.error("searchUser: ", e);
}
finally{
session.close();
}
return results;
Dans mon controleur, je fait ça :
Code:
public ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception {
SearchForm searchForm = (SearchForm) command;
String site = searchForm.getSite();
String name = searchForm.getName();
// Création d'un modèle
Map model = errors.getModel();
// Récupération de la liste des users correspondant aux critères de recherches
List list = userService.searchUser(site, name);
Iterator iterator = list.iterator();
List listUserSite = new ArrayList();
while (iterator.hasNext()){
User user = (User) iterator.next();
if(user.getUserSites()!= null) listUserSite.add(user.getUserSites());
}
// Tri de la liste
Collections.sort(list, new LabelComparator());
// Ajout de la liste des users au modèle avec la clé "users"
model.put("users", list);
// Ajout de la liste des users par site au modèle avec la clé "userSites"
model.put("userSites", listUserSite);
// Retour vers la page search.htm dans laquelle on charge le modèle créé
return showForm(request, response, errors, model);
}
Une fois dans ma page, je veux donc afficher mes résultats et je fais ça :
Code:
<c:forEach var="user" items="${users}">
<c:forEach var="userSite" items="${userSites}">
<tr>
<td align="center"><c:out value="${userSite.site.name}"/></td>
<td align="center"><c:out value="${user.name}"/></td>
</tr>
</c:forEach>
</c:forEach>
Bon et là, rien ne va plus :)
J'ai cette erreur :
Code:
javax.servlet.ServletException: Unable to find a value for "site" in object of class "org.hibernate.collection.PersistentSet" using operator "."
Alors je comprends pourquoi, j'ai cette erreur (je veux récupérer un site sur un objet qui n'est pas un UserSite mais un Set, d'où l'erreur).
La seule chose que je ne sais pas, c'est comment résoudre cette erreur et comment améliorer ma recherche parce que je trouve que ce n'est pas très performant.
Si quelqu'un avait déjà eu à faire ce genre de choses et pouvait me donner quelques conseils, ça serait très gentil :)
Merci de m'avoir lu jusque là en tout cas :)
Audrey.