Pergunta

Estou fazendo uma junção externa esquerda, mas eu sou apenas capaz de aplicar restrições na primeira tabela. Existe uma maneira ti aplicar na segunda tabela também?

Aqui está o meu código:

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

Isso funciona (requerente tem uma propriedade applicantName):

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

Nenhuma destas obras (produto tem uma propriedade productName)

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

criteria.add (Restrictions.eq ( "products.productName", "product1") // produtos: o nome da propriedade criteria.add (Restrictions.eq ( "Product.productName", "product1") // produto: o nome da tabela do DB

E esta é a exceção que eu estou recebendo dizendo (se eu entendi corretamente) que a propriedade productName não existe no Requerente:

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

Eu tentei usar um apelido, mas isso gerou um INNER JOIN, em vez da esquerda OUTER JOIN eu quero.

Como posso aplicar restrições em ambas as tabelas?

UPDATE:

Issue é provavelmente o mesmo que este: https://forum.hibernate.org/viewtopic.php?p=2393694

Foi útil?

Solução

Você pode especificar junção externa esquerda nas createalias ...

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

Esteja ciente de que você está fazendo uma junção externa esquerda com uma restrição nessa coluna ... essencialmente tornando-se uma junção interna. Se você também quiser candidatos sem produtos, então você vai ter que verificar a existência de produto nula também.

Outras dicas

Update:

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

Eu resolvi esse meu problema criando um novo critério e eu poderia usar LEFT_OUTER_JOIN em ambos os casos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top