2011-01-05 9 views
1

Ich habe sql wählen, für die ich schreiben wollen Kriterien. Ich habe einige Zeit gegoogelt, kann aber nichts für "nicht in" finden. My SQL-Abfrage:Hibernate Kriterien für verschachtelte Auswahl

select * from users where username not in(
select users.username from users right join authorities on users.username=authorities.username 
where authority='ROLE_ADMIN') 

Vielen Dank im Voraus. Grüße, Mat

Antwort

3

Vielen Dank für die Antwort, aber es ist nicht genau so. Sie haben alle Benutzer mit der Berechtigung "ROLE_ADMIN" ausgewählt, und ich benötigte alle Benutzer, die nicht "ROLE_ADMIN" sind. "Nicht" funktionierte nicht, weil es Benutzer gibt, die "ROLE_ADMIN" und "ROLE_MODERATOR" gleichzeitig haben. Ich habe es geschafft, es so zu lösen:

DetachedCriteria subCriteria = DetachedCriteria.forClass(Authorities.class); 
subCriteria.add(Property.forName("authority").ne(authorityName)); 
subCriteria.setProjection(Projections.property("users")); 

DetachedCriteria criteria = DetachedCriteria.forClass(getPersistentClass()); 
criteria.add(Property.forName("username").notIn(subCriteria)); 
return getHibernateTemplate().findByCriteria(criteria); 

Es funktioniert, aber denken Sie, es ist eine gute Lösung?

0

Sie die Autorität als Eigenschaft der Klasse Benutzer in Ihrem Hibernate Mapping-Karte sollte

<many-to-one name="authority" class="Authority" column="AUTHORITY_ID" 

Danach ist es einfach, die Kriterien Abfrage zu erstellen:

List users = sess.createCriteria(User.class) 
.createCriteria("authority") 
.add(Restrictions.eq("authority_name", "ROLE_ADMIN")) 
.list