5
respostas

jpql duvida

Como fazer um select com uma junção de tabela de grupo? por exemplo tabela funcionario tem nome e senha.

Select f from Funcionario f where f.nome = :pNome and f.senha = :pSenha.

Aqui estou fazendo um select com que o cliente digitou no login, ok, mais queria uma permisão que só os administradores ou gerente tivesse acesso! então no funcionario criei um grupo como ficaria o select completo?

public class Grupo implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    private String nome;
public class Funcionario implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    private String nome;
    private boolean ativo;
    private String cpf;
    private String email;
    @Temporal(TemporalType.DATE)
    private Calendar dataNascimento = Calendar.getInstance();
    private String nomeUsuario;
    private BigDecimal salario = new BigDecimal(0.0D);
    private String senha;
    @Lob
    private Byte[] foto;
    @ManyToOne
    @JoinColumn(name = "grupo_codigo")
    private Grupo grupo = new Grupo();
5 respostas

Oi Alisson.

Vc pode tentar fazer assim o join:

Select f from Funcionario f 
    JOIN f.grupo g 
        where f.nome = :pNome and f.senha = :pSenha and g.codigo = :pCodigo.

Muito bom cara, agora na sua explicação fiquei com uma duvida, qual diferença entre join fetch e apenas join? no meu caso eu ja tenho um nome no meu grupo que seria gerente correto? como fazia isso passando uma string na consulta?

Select f from Funcionario f 
    JOIN f.grupo g 
        where f.nome = :pNome and f.senha = :pSenha and g.nome = "gerente"; algo assim?

Sobre a diferença de join, vc pode ver nosso curso de SQL, pois essa é mais voltada ao SQL do q o JPQL.

Não é bom passar valor fixo na consulta, como vc fez ali com a palavra GERENTE, sempre é bom parar pelo "coringa", igual vc fez para o nome e para a senha.

Mas caso realmente queira colocar esse nome fixo par ao grupo, não teria problema como vc colocou.

Mais Lazaro os join e join fetch podemos dizer que é a mesma coisa?

Alisson, até onde eu sei, o join fetch é usado quando você que fazer uma consulta do tipo (fetch=FetchType.EAGER).

eu sempre deixo anotado como fetchType.LAZY no relacionamento dos atributos da minha @entity, já que na maioria das vezes não preciso fazer uma busca do tipo EAGER, e quando preciso realizar uma consulta para buscar com o comportamento EAGER, na jpql eu realizo o join fetch mudando o comportamento que foi especificado no meu relacionamento.

posso ta falando besteira, mas como você ta utilizando um relacionamento @manyToOne, vc não precisa fazer join fetch, já que o mesmo é utilizado em relacionamento @oneToMany ou @ManyToMany, pois fazendo foin fetch você em 1 select busca toda lista relacionado a esse atributo.