Queries no JPA

11 respostas
UpTheIrons

Olá pessoal,

Tenho uma entidade Conta e uma ContaDepende que serve para fazer
um relacionamento, n sei se o termo seria recursivo nesse caso, mas
pelo menos M-M.

Em ContaDepende tem IdPai e IdFilho

Como fica uma consulta para, por ex., buscar uma conta e exibir tb a conta associada?

Tenho tido alguns problemas com JPA, mas estou me batendo e as coisas estão fluindo, mas as
vezes trava em bobeiras assim.

11 Respostas

UpTheIrons

Tiago,

Eh f…
Eu vim pro Java por 2 únicas razões, mas qdo apanho dessas coisas… cacetada, dá
vontade de continuar meu projeto onde eu realmente sei *rrr
Mas td bem, vamos indo, pq o q tô descobrindo do Java até agora, tá legal.

bsl.lacerda

Qual provider? Hibernate 3?
Posta aí o mapeamento do relacionamento entre estas duas classes…
De repente… Quem sabe…

UpTheIrons

Olá Bruno,

Usando o TopLink

Bruno Lacerda:
Qual provider? Hibernate 3?
Posta aí o mapeamento do relacionamento entre estas duas classes…
De repente… Quem sabe…

algo assim:

@Entity

@Table(name = cad_conta)

@Inheritance(strategy=InheritanceType.JOINED)

public class Conta implements Serializable {

private static final long serialVersionUID = 1L;

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

@Column(name = conta_id)

private Integer ID;

@Column(name = conta_padrao)

private Boolean padrao;

@Column(name = conta_descricao, length=50)

private String descricao;
@OneToMany(mappedBy = "pai")
private Collection<ContaDepende> contaPaiCollection;
    @OneToMany(mappedBy = "filho")
private Collection<ContaDepende> contaFilhoCollection;

E do outro lado:

@Entity

@Table(name=cad_conta_depende)

public class ContaDepende implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "depende_id")
private Integer ID;
@JoinColumn(name = "depende_pai_conta_id", referencedColumnName = "conta_id")
@ManyToOne(optional = false)
private Conta pai;
@JoinColumn(name = "depende_filho_conta_id", referencedColumnName = "conta_id")
@ManyToOne(optional = false)
private Conta filho;

E eu quero Buscar por ex. uma conta (q seria filha)… e possa exibir tb a outra conta (pai).

Tendeu aí?

UpTheIrons

Consegui pegar, mas n sei se eh a melhor solução.

//Minha Query
em.createQuery("Select c FROM Conta c LEFT OUTER JOIN c.contaPaiCollection cp WHERE c.tipo.ID =:tipoId");

//Outro pedaço de código...

 for(Conta conta : lsConta)
        {
            System.out.println(conta.getDescricao());
            Collection<ContaDepende> lsCD = conta.getContaFilhoCollection();
            for(ContaDepende cd : lsCD)
                System.out.println(cd.getPai().getDescricao());
        }

Vou testar mais.
Pq o q realmente eu queria era trazer já na consulta.

saviobarr

Segundo a spec, quando é necessário pegar um objeto, e carregar também os relacionamentos, deve-se usar o fetch type setado para EAGER.

@OneToMany(cascade=cascadeType.ALL, mappedBy="pessoa" fetch=FetchType.EAGER)
      private List<Telefone> telefones;

Exemplo de um relacionamento pessoa-telefone, onde uma pessoa tem vários telefones.
Setando o fetch para EAGER, ao recuperar pessoa, vc recupera os telefones também.
Bom, esse foi meu entendimento sobre sua dúvida. Se eu estiver equivocado ficarei contente se você puder me explicar melhor o que precisa.
Feliz Natal a todos.

Sávio

UpTheIrons

Olá Savio, blz?

Era isso mesmo, eu tinha testado logo em seguida e ele tinha funcionado, só
q não precisei colocar fetch=FetchType.EAGER como parâmetro, é um padrão do Java?

Se for um padrão, isso n recarrega um objeto a toa, por ex, se eu quisesse carregar
um objeto sem as associações, n teria como então?

Feliz natal (atrasado)

saviobarr

Não é exatamente Java. É JPA, que inclusive o Hibernate também implementa. Para não carregar objetos “à toa”, não trazer os objetos relacionados, vc põe o valor do fetch = LAZY. Ex.:

@OneToMany(mappedBy="pessoa", fetch=Fetchtype.LAZY)

Qq coisa estamos na área.

Sávio

UpTheIrons

Ops, eu quis dizer JPA mesmo, foi mal.

Certo, era isso mesmo q eu queria, eu tinha lido sobre e tinha vacilado.

Eu tô me batendo em algo aqui (q tem a v com isso), se n eu conseguir,
vou postar hj ainda aqui a dúvida.

Falew!

UpTheIrons

Savio,

Como eu disse, aquela era a informação q eu precisava.
Mas me diz uma coisa, eu tenho uma tabela com relacionamento N-N,
que segue o seguinte modelo.
TabelaA
e a TabelaB que serve para manter a relação NN entre nos registros da tabelaA (recursivo)

Mas se quero por ex. selecionar um registro da TabelaA (registro filho) e apenas um campo da TabelaB (registro pai),
eu tô tendo q percorrer a coleção (tabelaB). Não teria como buscar de alguma forma mais limpa, já que o registro
da tabelaA (q no caso sendo filho) só pode ter um “pai”?

Ficou confuso isso ai? :slight_smile:

tiaguinhooo

cara to na mesma que vc eu quero fazer isso mesmo

to apanhando muitoooo

pra ttratar o resultado disso ai

minha duvida é a sua

uauhuhas!

tiaguinhooo

qm posta eu ou vc ?

Criado 22 de dezembro de 2008
Ultima resposta 22 de dez. de 2008
Respostas 11
Participantes 4