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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top