Hibernate Criteri: Left outer join con restrizioni su entrambe le tabelle
-
18-09-2019 - |
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
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.