Pessoal, tenho as seguintes classes abaixo.
public class Usuario {
private Integer id;
private Email email;
private String nome;
outros atributos
private List<Grupo> grupos;
// construtor para selecionar colunas especificas
public Usuario(Integer id, String email, String nome) {
this.id = id;
this.email = new Email(email);
this.nome = nome;
}
// relacionamento em que não faço ideia de como selecionar em uma consulta especifica
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "usuario_grupo",
joinColumns = @JoinColumn(name = "usuario_id"),
inverseJoinColumns = @JoinColumn(name = "grupo_id"))
public List<Grupo> getGrupos() {
return grupos;
}
public void setGrupos(List<Grupo> grupos) {
this.grupos = grupos;
}
}
public class Grupo {
private Integer id;
private String nome;
}
public class Email {
private Integer id;
private String email;
}
Para fazer uma query especifica de Usuario, trazendo alguns atributos “simples” e objetos de um relacionamento (Email) é tranquilo, crio o construtor conforme acima e faço a pesquisa:
Minha dúvida é: como fazer uma query especifica para trazer Grupos?
Se não fosse query especifica, seria simples, bastaria fazer o seguinte:
Só que assim irá trazer vários outros objetos do relacionamento, o que não seria o caso.
Alguém sabe o que fazer neste caso?
[quote=samerjamal]Pessoal, tenho as seguintes classes abaixo.
public class Usuario {
private Integer id;
private Email email;
private String nome;
outros atributos
private List<Grupo> grupos;
// construtor para selecionar colunas especificas
public Usuario(Integer id, String email, String nome) {
this.id = id;
this.email = new Email(email);
this.nome = nome;
}
// relacionamento em que não faço ideia de como selecionar em uma consulta especifica
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "usuario_grupo",
joinColumns = @JoinColumn(name = "usuario_id"),
inverseJoinColumns = @JoinColumn(name = "grupo_id"))
public List<Grupo> getGrupos() {
return grupos;
}
public void setGrupos(List<Grupo> grupos) {
this.grupos = grupos;
}
}
public class Grupo {
private Integer id;
private String nome;
}
public class Email {
private Integer id;
private String email;
}
Para fazer uma query especifica de Usuario, trazendo alguns atributos “simples” e objetos de um relacionamento (Email) é tranquilo, crio o construtor conforme acima e faço a pesquisa:
Minha dúvida é: como fazer uma query especifica para trazer Grupos?
Se não fosse query especifica, seria simples, bastaria fazer o seguinte:
Só que assim irá trazer vários outros objetos do relacionamento, o que não seria o caso.
Alguém sabe o que fazer neste caso?[/quote]
SELECT g FROM Usuario u LEFT JOIN u.grupos g :3
Aí você pode refinar por quais grupos de determinado usuário você quer: where u.id = 33
Herbert, eu preciso fazer uma query especifica, trazendo do Usuário apenas id, nome e Grupos. Aquele exemplo foi de como é fácil fazer um select em todo o objeto Usuario, o que não é o caso. Daquela maneira, irá trazer vários outros objetos que se relacionam com Usuario.
Preciso de algo como:
Mas isso não funciona! Tem alguma ideia?
[quote=samerjamal]Herbert, eu preciso fazer uma query especifica, trazendo do Usuário apenas id, nome e Grupos. Aquele exemplo foi de como é fácil fazer um select em todo o objeto Usuario, o que não é o caso. Daquela maneira, irá trazer vários outros objetos que se relacionam com Usuario.
Preciso de algo como:
Mas isso não funciona! Tem alguma ideia?[/quote]
Você só conseguirá fazer isso caso utilize JPA 2.1
Com o JPA 2.1 tem a função chamada EntityGraph. Com essa função você consegue selecionar o que será retornado.
Pesquise no google por: JPA EntityGraph
Eu uso o JPA 2.1 mesmo, era exatamente o que eu precisava, deu certinho.
Obrigado Hebert. Aproveitando: parabéns pelo seu trabalho (blog e livros).
Abraço
Apenas para deixar registrado: no final das contas, não fez exatamente o que eu queria.
Caso existe uma Classe qualquer com 500 atributos “simples” (Integer id, String nome, String telefone, Date dataNascimento e outros tantos iguais) e 3 atributos que sejam Entidades (Cliente cliente, Email email, List grupos), OBRIGATORIAMENTE tem que selecionar TODOS os 500 atributos “simples” para poder trazer uma das Entidades.
É impossível fazer um [quote]SELECT u.id, u.nome, u.grupos FROM Usuario u LEFT JOIN u.grupos g[/quote] para trazer apenas 2 atributos “simples” e uma Entidade.