Criteria - Retornar somente entidade pai

2 respostas
M

Bom dia pessoal.
Bem estou com um problema relacionado ao retorno de uma consulta criteria:

DetachedCriteria criteria = DetachedCriteria.forClass(Categoria.class, "c") .createAlias("c.dadoCategoria", "dc", Criteria.INNER_JOIN) .createAlias("dc.localizacao", "l", Criteria.INNER_JOIN) .add(Restrictions.eq("l.padrao", true)) .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

Preciso que esta criteria me retorne somente os dados da Categoria, não selecionando os dados as entidades relacionadas com INNER JOIN.
Mas ela me retornar todos os dados, da Categoria, DadoCategoria e Localização.

Alguem tem ideia de como fazer isto?
Obs: tem que ser com criteria, porque esta consulta não funciona com outros modos de consulta.

Abraços.

2 Respostas

lindberg713

Vc está mapeando os relacionamento como FetchType.LAZY?

Isso vai fazer com que o hibernate só traga os objetos que compoem os relacionamentos quando for necessário, ou seja quando o método get do relacionamento for chamado.

Por exemplo, Cliente tem vários Pedidos, então se esse relacionamento for Lazy quando vc tiver um objeto Cliente o hibernate só vai trazer pedidos quando vc chamar cliente.getPedidos, quando esse método for chamado o hibernate seta os pedidos em cliente.

Não entendi bem se é esse o seu problema pois entendi que seu problema era trazer apenas os dados da entidade Categoria e não os de localização e dados categoria. Se for isso, então é isso o que eu falei, se mapear com lazy ele só trás categoria, caso chame categoria.getDadosCategoria e/ou categoria.getLocalizacao então o hibernate vai setar pra vc e retornar os objetos de DadoCategoria e Localizacao.

Espero ter ajudado.

Victor Lindberg

M

Nao é bem este meu problema, veja tenho estas 3 entidades:

public class Categoria {

    private Integer idCategoria;

    @OneToOne(mappedBy="categoria", fetch=FetchType.LAZY)
    private DadoCategoria dadoCategoria;

    @OneToMany(mappedBy="categoria", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private List<DadoCategoria> dadosCategoria;

   ....
}

public class DadoCategoria {

    private Integer idDadoCategoria;

    @ManyToOne(fetch=FetchType.LAZY, optional=false)
    private Categoria categoria;

    @ManyToOne(fetch=FetchType.LAZY, optional=false)
    private Localizacao localizacao;
    
   ...
}

public class Localizacao implements Serializable {

    private Integer idLocalizacao;

   ....
}

Veja, uma categoria pode ter vários dados em várias localizações diferentes.
Acontece que eu sempre necessito buscar apenas um único dado da categoria quando busco ela (o que corresponde a localição atual)
Entao o que me interessa é somente a categoria e os dados dela, mas para isso preciso buscar pela localizacao atual.
So que cada inner join com criteria ele retorna as entidades populadas, mesmo que eu não necessite de seus dados.

Abraços

Criado 3 de março de 2010
Ultima resposta 6 de mar. de 2010
Respostas 2
Participantes 2