JPA query com colunas especificas

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.