Hibernate molti-a-molti criteri di proiezione
-
02-10-2019 - |
Domanda
MODIFICA> io sono in un vicolo cieco ... così posso continuare a cercare la ragione principale .. La prego di dirmi come fare un semplice criterio per molti a molti rapporti che ha più di un restrizioni eq, per un esempio , come ottenere la persona che parla ita & tedesco nell'esempio qui ...
La mia situazione è come questo ho due classi di persone e le lingue, con un n, m rapporto .. e sto usando un criterio di fare la ricerca - ottenere tutte le persone che parlano es. Inglese e tedesco
@Entity
public class Person implements Serializable {
private int id;
...........
private Set<Languages> languages = new HashSet<Languages>();
...............
@ManyToMany
@JoinTable(name = "link_person_languages")
public Set<Languages> getLanguages() {
return languages;
}
}
@Entity
public class Languages implements Serializable {
private int id;
private String name;
@Id
@GeneratedValue
public int getId() {
return id;
}
@Column(nullable = false, length = 40, unique = true)
public String getName() {
return name;
}
Criteri
Criteria crit = session.createCriteria(Person.class);
crit.setCacheable(true);
ProjectionList projList = Projections.projectionList();
projList.add(Projections.property("languages"));
c = enumMap.get(attr);
if (c.isChanged()) {
Criteria crit2 = crit.createCriteria("languages");
Object[] o = (Object[]) c.getAnswer();
Conjunction con = Restrictions.conjunction();
for (int j = 0; j < o.length; j++) {
Criterion tmp = Restrictions.eq("id", ((Languages)o[j]).getId());
con.add(tmp);
}
crit2.add(con);
}
crit.setProjection(projList);
retList = crit.list();
E la cosa divertente è, se ho impostato solo per una lingua, ho la corretta elenco delle persone, ma per più di una lingua ricevo nessuno, ho ricontrollato la mia base e impostare una persona specifficaly di parlare 2 lingue . Ma ciò che mi punte più di tutto è che il risultato della proiezione nel Object [] sul luogo in cui le lingue set dovrebbero essere, non v'è valore NULL ......
aiuto per favore TNX
Soluzione
Quello che state facendo molto vecchio stile JDBC (JDBC è ciò che le persone molto anziane utilizzati per l'accesso DB) sarebbe qualcosa di simile:
SELECT * FROM PERSON WHERE LANGUAGE_ID = 1 AND LANGUAGE_ID = 2
(solo esempio, non esattamente SQL)
E, se si esegue questo sql non potrà mai restituire una singola linea (molto triste ...) perché non c'è nessun riga nella tabella con LANGUAGE_ID = 1, LANGUAGE_ID = 2.
Io non so davvero il modo migliore per risolvere il problema (Hibernate non è il mio forte abilità), ma nel tuo caso (se il numero lingue non è così grande) vorrei fare 2 (o 3, o di un ciclo ) di selezioni e si uniscono quindi utilizzando un semplice insieme nel codice. Non è la soluzione migliore ... E io felice se qualcuno mostrare un modo migliore