Pessoal estou com duvida de como fazer uma subconsulta com criteria.
Eu dei uma pesquisada mas não entendi muito bem como faço.
O que eu quero é que o metodo me traga uma lista das baias que estão vazias, ou seja, que não ha usuarios referenciando ela.
Por enquanto esta assim:
public ArrayList<Baia> EmptyBaia(){
DetachedCriteria subconsulta = DetachedCriteria.forClass(Usuarios.class).add(criterion)
ArrayList<Baia> baia = this.session.createCriteria(this.classe).add(Subqueries.?)
}
A minha duvida é oque eu devo usar no criterion e oque devo colocar no lugar do “?”
Para facilitar oque eu quero é essa consulta:
select * from baia where numero not in (select baia from usuarios);
Muito obrigado pela ajuda
Eu acho que descobri.
Fiz assim:
public ArrayList<T> EmptyBaia(){
DetachedCriteria subconsulta = DetachedCriteria.forClass(Usuarios.class);
ArrayList<T> baia = (ArrayList<T>) this.session.createCriteria(this.classe).add(Subqueries.notIn("baia", subconsulta)).list();
return baia;
}
Mas ele esta retornando esse erro:
[code]javax.servlet.ServletException: java.lang.NullPointerException
org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:535)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:433)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
root cause
java.lang.NullPointerException
org.hibernate.loader.criteria.CriteriaQueryTranslator.getProjectedTypes(CriteriaQueryTranslator.java:318)
org.hibernate.criterion.SubqueryExpression.toSqlString(SubqueryExpression.java:56)
org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:334)
org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:82)
org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:67)
org.hibernate.impl.SessionImpl.list(SessionImpl.java:1550)
org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
MZSuporte.dao.Dao.EmptyBaia(Dao.java:87)
action.SearchUserBaiaAction.execute(SearchUserBaiaAction.java:21)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
repetindo a consulta que quero é essa:
select * from baia where numero not in (select baia from usuarios);
Oque esta faltando? Onde estou errando?
Depois de tanto procurar e de tanto errar consegui uma solução.
Fiz assim:
public ArrayList<T> EmptyBaia(){
DetachedCriteria subconsulta = DetachedCriteria.forClass(Usuarios.class).setProjection(Property.forName("baia"));
ArrayList<T> baia = (ArrayList<T>) this.session.createCriteria(this.classe).add(Property.forName("numero").notIn(subconsulta)).list();
return baia;
}
que faz ele retornar essa consulta:
select
this_.numero as numero2_1_,
this_.monitor as monitor2_1_,
this_.pc as pc2_1_,
this_.pto_rede as pto4_2_1_,
this_.tamanho as tamanho2_1_,
this_.pto_tel as pto5_2_1_,
tamanhobai2_.id as id3_0_,
tamanhobai2_.nome as nome3_0_
from
baia this_
left outer join
tamanho_baia tamanhobai2_
on this_.tamanho=tamanhobai2_.id
where
this_.numero not in (
select
this0__.baia as y0_
from
usuarios this0__
)
Espero que ajude a outros, se alguem tiver duvidas fiquem a vontade.
Abss a todos
Olá vinicius_roc, td bem??
Sei que o post é antigo, mas gostaria de uma ajuda sua…
Estou querendo usar a criteria para fazer um select no banco de apenas alguns itens, mas estou com uma dúvida danada em como proceder… é mais ou menos assim:
Eu tenho uma tabela de programa, uma tabela de servicos que ficam relacionadas com a tabela de programa. Eu criei os métodos na classe Bean para selectOneMenu do Programa, e selectManyCheckBox para os servicos. A questao é: eu quero que, quando seja selecionado um programa X, me apareçam abaixo apenas os serviços referentes àquele programa q eu selecionei…
Mas estou apanhando em como devo fazer.
Se vc ou alguem puder me ajudar, agradeço!!!