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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top