Domanda

Sto facendo un ESTERNO LEFT JOIN, ma sono in grado di applicare restrizioni al primo tavolo unico. C'è un modo applicare ti nella seconda tabella come bene?

Qui è il mio codice:

Criteria criteria = this.crudService
        .initializeCriteria(Applicant.class).setFetchMode("products",
              FetchMode.JOIN);.

Questo funziona (richiedente ha una proprietà applicantName):

criteria.add(Restrictions.eq("applicantName", "Markos")

Nessuno di questi lavori (prodotto ha una proprietà productName)

criteria.add(Restrictions.eq("productName", "product1")

criteria.add (Restrictions.eq ( "Products.ProductName", "product1") // prodotti: il nome della proprietà criteria.add (Restrictions.eq ( "Product.productName", "product1") // prodotto: il nome della tabella DB

E questa è l'eccezione che sto ricevendo dire (se ho capito bene) che la proprietà productName non esiste in Richiedente:

EJB Exception: ; nested exception is: org.hibernate.QueryException: could not resolve property: products.inventedName of: org.myCompany.applicant.entity.Applicant; nested exception is: org.hibernate.QueryException: could not resolve property: products.inventedName of: org.myCompany.applicant.entity.Applicant

Ho cercato di usare un alias, ma questo ha generato un INNER JOIN, invece che a sinistra outer join che voglio.

Come posso essere previste restrizioni su entrambi i tavoli?

UPDATE:

problema è probabilmente lo stesso di questo: https://forum.hibernate.org/viewtopic.php?p=2393694

È stato utile?

Soluzione

È possibile specificare esterno sinistro partecipare alle CREATEALIAS ...

.CreateAlias("products", "p", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.Add(Restrictions.Eq("p.inventedName", inventedName));

essere consapevoli del fatto che si sta facendo un join esterno sinistro con una restrizione su quella colonna ... in sostanza, che lo rende un inner join. Se si desidera anche candidati senza prodotti, allora si dovrà verificare la presenza di prodotto nulla troppo.

Altri suggerimenti

Aggiornamento:

.CreateAlias("products", "p", JoinType.LEFT_OUTER_JOIN)
.Add(Restrictions.Eq("p.inventedName", inventedName));

Ho risolto questo il mio problema di creare un nuovo criterio e ho potuto utilizzare LEFT_OUTER_JOIN in entrambi i casi.

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