Nao rodar sql no get list de um relacionamento many to many

6 respostas
rodrigovidalxc

Boa tarde a todos estou desenvolvendo um aplicação onde
um cliente tem n condições e uma condição pode pertencer a n clientes, o que gera uma relação many to many
eu mapei assim :

@Entity
@Table(name = "v_clientes")
public class Cliente implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "ID_CLIENTE")
    private Integer idCliente;
    @Column(name = "NOME_FANTASIA")
    private String nomeFantasia;
    @JoinTable(name = "v_clientes_condicoes_pgto", joinColumns = {
        @JoinColumn(name = "ID_CLIENTE", referencedColumnName = "ID_CLIENTE")}, inverseJoinColumns = {
        @JoinColumn(name = "ID_CONDICAO_PGTO", referencedColumnName = "ID_CONDICAO_PGTO")})
    @ManyToMany(fetch = FetchType.LAZY)
    private List<CondicaoPgto> condicaoPgtoList;
    ...

como eu mapeei como lazy quando eu consulto os clientes ele nao realiza a consulta nas condiçoes de pgto.
mas qndo eu dou um getCondicaoPgtoList() entao ele dispara um sql no banco onde me traz todas as condições,
nessa parte que eu gostaria de mudar gostaria que ele me trouxesse apenas as condições ativas
tem como eu especificar o select que será disparado qndo eu der o get na lista ?

6 Respostas

Hebert_Coelho

Até onde me lembro não.

O que você poderia fazer era utilizar um hql. Com isso você iria trazer apenas quem você quisesse.

rodrigovidalxc

Vou explicar melhor :
quero disponibilizar os dados via web service, para isso o usuario iria me fornecer o id do cliente , uma senha e a data da ultima atualização :

assim eu teria que consultar
todas as condiçoes daquele cliente que foram alteradas apos aquela data…

como eu faria isso ? lembrando que qndo eu der um getCondiçoesPgtoList() eu terei que trazer apenas as condiçoes especificadas acima.

Hebert_Coelho

Com o HQL você buscaria todos os dados que você precisa.

seria algo do tipo

select a from Aluno a join fetch a.materias m where m.nome = 'matematica';

Esse cara iria te trazer um aluno e ao fazer aluno.getMaterias() viriam os caras devidos apenas. [=

rodrigovidalxc

jakeFrog estou fazendo assim:

public List<Cliente> findById2(Integer idCliente, Date dtAtualizacao ){

        String sql = "select c "
                + "   from Cliente c left outer join c.condicaoPgtoList as cond  "
                + "   where c.idCliente = :idCliente "
                + "    and  cond.dtAtualizacao >= :dtAtualizacao ";

        List<Cliente> lista =  em.createQuery(sql).setParameter("idCliente",idCliente).setParameter("dtAtualizacao", dtAtualizacao).getResultList();
        return lista;

    }

no main ()

public static void main(String[] args) {

        ClienteDao dao  = new ClienteDao();
        List<Cliente> lista = dao.findById2(155, new GregorianCalendar(2012,GregorianCalendar.FEBRUARY, 7).getTime() );

        for( Cliente cliente : lista){
            System.out.println("-----------------get do nome fantasia -----------");
            System.out.println(cliente.getNomeFantasia());
            System.out.println("-----------------get do Condicao Pgto list -----------");

            for( CondicaoPgto cond : cliente.getCondicaoPgtoList()){
                System.out.println(cond);
            }
        }

    }

e o resultado de saida é esse :

[EL Info]: 2012-02-13 22:51:42.604--ServerSession(4115088)--Thread(Thread[main,5,main])--file:/E:/development.with.subversion/ws.model/build/classes/_ws.PU login successful
[EL Fine]: 2012-02-13 22:51:42.68--ServerSession(4115088)--Connection(30216319)--Thread(Thread[main,5,main])--SELECT t0.ID_CLIENTE, t0.DT_VENCIMENTO_SIVISA, t0.DS_EMAIL, t0.NOME_FANTASIA, t0.VL_LIMITE, t0.RAZAO_SOCIAL, t0.ENDERECO_CEP, t0.NR_INSCRICAO_ESTADUAL, t0.ENDERECO_COMPLEMENTO, t0.NR_ALVARA_ANVISA, t0.VL_LIMITE_DISPONIVEL, t0.DT_VENCIMENTO_ANVISA, t0.ENDERECO_NRO, t0.ENDERECO_BAIRRO, t0.ENDERECO_CIDADE, t0.DT_ATUALIZACAO, t0.ENDERECO, t0.NR_ALVARA_SIVISA, t0.NR_CNPJ FROM v_clientes t0, v_clientes_condicoes_pgto t2, v_condicoes_pgto t1 WHERE (((t0.ID_CLIENTE = ?) AND (t1.DT_ATUALIZACAO = ?)) AND ((t2.ID_CLIENTE (+) = t0.ID_CLIENTE) AND (t1.ID_CONDICAO_PGTO (+) = t2.ID_CONDICAO_PGTO)))
        bind => [155, 2012-02-07]
-----------------get do nome fantasia -----------
Empresa teste( 155 )
-----------------get do Condicao Pgto list -----------
[EL Fine]: 2012-02-13 22:51:42.979--ServerSession(4115088)--Connection(30216319)--Thread(Thread[main,5,main])--SELECT t1.ID_CONDICAO_PGTO, t1.STATUS, t1.VL_PEDIDO_MINIMO, t1.DS_CONDICAO_PGTO, t1.DT_ATUALIZACAO FROM v_clientes_condicoes_pgto t0, v_condicoes_pgto t1 WHERE ((t0.ID_CLIENTE = ?) AND (t1.ID_CONDICAO_PGTO = t0.ID_CONDICAO_PGTO))
        bind => [155]

Condicao 1 - dt 01/01/2011
Condicao 2 - dt 02/02/2012
Condicao 3 - dt 12/02/2012
Condicao 4 - dt 13/02/2012

Se vc perceber ele fez o select que eu pedi porem qndo eu dei o getCondicaoPgtoList ele deu outro select, alguem sabe como resolver esse problema ?

pois o retorno deveria ser apenas

Condicao 3 - dt 12/02/2012
Condicao 4 - dt 13/02/2012

Kura

Opa! Tudo bom?

Você conseguiu resolver isso, cara?

Kura

Nossa! Não tinha visto o join fetch que o Hebert colocou.
Resolveu aqui. Obrigado mesmo!

Criado 13 de fevereiro de 2012
Ultima resposta 26 de out. de 2012
Respostas 6
Participantes 3