2013-10-25 4 views
6
criteria = createCriteria("employee"); 
criteria.add(Restrictions.eq("name", "John")); 
criteria.addOrder(Order.asc("city")); 
criteria.addOrder(Order.asc("state")); 
List result = criteria.list(); 

Questa istruzione restituisce un elenco di Employee oggetti. Come posso restituire uno Set di oggetti Employee, al fine di rimuovere i dati duplicati?Restituisce un set al posto della lista con i criteri Hibernate

Capisco che posso raggiungere questo risultato creando un set dalla lista restituita come di seguito, ma poi perderei l'ordine di classificazione della lista. E non voglio dover scrivere codice per ordinare il set.

Set<Employee> empSet = new HashSet<Employee>(result); 
+3

Hai provato a utilizzare un 'LinkedHashSet'? Quello conserverà l'ordine, penso. – yamafontes

+2

Forse questo dovrebbe aiutare: [can-hibernate-return-a-collection-of-result-objects-other-a-list] (http://stackoverflow.com/questions/416970/can-hibernate-return- a-collection-of-result-objects-other-a-list) – baltov

+0

Stai cercando questo? http://stackoverflow.com/questions/10731723/how-to-add-distinct-in-hibernate-criteria – Taylor

risposta

2

come i commenti e javadoc suggerire, è necessario restituire un List da Criteria. Pertanto, la tua unica opzione è rimuovere univoci dopo il fatto. Come ha detto KepaniHaole, dovresti usare un LinkedHashSet se vuoi preservare l'ordine.

7

Non penso sia possibile restituire un Set utilizzando Criteria basato su javadoc. Tuttavia, se si desidera rimuovere i dati duplicati, perché non aggiungere uno Projections.distinct(...) allo Criteria esistente per rimuovere i duplicati?

http://docs.jboss.org/hibernate/envers/3.6/javadocs/org/hibernate/criterion/Projections.html

UPDATE

Ad esempio, se si desidera applicare un SELECT DISTINCT sul nome del dipendente (o qualche identificatore (s)) per ottenere un elenco di dipendenti unici, si può fare qualcosa in questo modo: -

List result = session.createCriteria("employee") 
      .setProjection(Projections.distinct(Projections.property("name"))) 
      .add(Restrictions.eq("name", "John")) 
      .addOrder(Order.asc("city")) 
      .addOrder(Order.asc("state")) 
      .list(); 

in questo modo, non si ha realmente bisogno di preoccuparsi di utilizzare Set a tutti.

Problemi correlati