Hibernate Criterios: combinación externa izquierda con restricciones en ambas tablas
-
18-09-2019 - |
Pregunta
Estoy haciendo un LEFT OUTER JOIN, pero yo soy más capaz de aplicar restricciones en la primera tabla. ¿Hay alguna manera se aplican ti en la segunda tabla también?
Aquí está mi código:
Criteria criteria = this.crudService
.initializeCriteria(Applicant.class).setFetchMode("products",
FetchMode.JOIN);.
Esto funciona (solicitante tiene una propiedad applicantName):
criteria.add(Restrictions.eq("applicantName", "Markos")
Ninguna de estas obras (producto tiene una propiedad productName)
criteria.add(Restrictions.eq("productName", "product1")
criteria.add (Restrictions.eq ( "Products.ProductName", "producto1") // productos: el nombre de la propiedad criteria.add (Restrictions.eq ( "Product.productName", "producto1") // Producto: el nombre de la tabla de base de datos
Y esta es la excepción que estoy recibiendo diciendo (si he entendido bien) que la propiedad productName no existe en Solicitante:
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
He intentado utilizar un alias, pero esto genera un INNER JOIN, en lugar de la combinación externa izquierda que quiero.
¿Cómo puedo aplicar restricciones en ambas tablas?
ACTUALIZACIÓN:
El tema es probablemente el mismo que esto: https://forum.hibernate.org/viewtopic.php?p=2393694
Solución
Puede especificar externa izquierda en las createalias ...
.CreateAlias("products", "p", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.Add(Restrictions.Eq("p.inventedName", inventedName));
Tenga en cuenta que usted está haciendo una combinación externa izquierda con una limitación en esa columna ... por lo que es esencialmente una combinación interna. Si también desea solicitantes sin productos entonces usted tendrá que comprobar para el producto nulo también.
Otros consejos
Actualización:
.CreateAlias("products", "p", JoinType.LEFT_OUTER_JOIN)
.Add(Restrictions.Eq("p.inventedName", inventedName));
He resuelto este problema al crear mi un nuevo criterio y pude utilizar LEFT_OUTER_JOIN en ambos casos.