Hibernate Criteria SubConsulta

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!!!