Hibernate Critérios: Esquerda associação exterior com restrições de ambas as tabelas
-
18-09-2019 - |
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
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.