ajuda com Query Hibernate

02/01/2016

2

Boa noite gostaria de uma ajuda com uma query gostaria de fazer uma pesquisa da classe pessoa com a seguinte estrutura

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Basic(optional = false)
	@Column(name = "ID")
	private Integer id;
	@Column(name = "NOME")
	private String nome;
	@Column(name = "TIPO")
	private String tipo;
	@Column(name = "EMAIL")
	private String email;
	@Column(name = "SITE")
	private String site;
	@Column(name = "CLIENTE")
	private String cliente;
	@Column(name = "FORNECEDOR")
	private String fornecedor;
	@Column(name = "COLABORADOR")
	private String colaborador;
	@Column(name = "TRANSPORTADORA")
	private String transportadora;
	@OneToOne(fetch = FetchType.EAGER, mappedBy = "pessoa", cascade = CascadeType.ALL)
	private PessoaFisica pessoaFisica;
	@OneToOne(fetch = FetchType.EAGER, mappedBy = "pessoa", cascade = CascadeType.ALL)
	private PessoaJuridica pessoaJuridica;
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "pessoa", cascade = CascadeType.ALL, orphanRemoval = true)
	private Set<PessoaEndereco> listaPessoaEndereco;
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "pessoa", cascade = CascadeType.ALL, orphanRemoval = true)
	private Set<PessoaContato> listaPessoaContato;
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "pessoa", cascade = CascadeType.ALL, orphanRemoval = true)
	private Set<PessoaTelefone> listaPessoaTelefone;
	@ManyToMany(fetch = FetchType.EAGER)
	@JoinTable(name = "EMPRESA_PESSOA", joinColumns = { @JoinColumn(name = "ID_PESSOA") }, inverseJoinColumns = { @JoinColumn(name = "ID_EMPRESA") })
	private Set<Empresa> listaEmpresa;





gostaria de fazer a busca por empresa, endereço, pessoa física, pessoa jurídica, nome e entre outros atributos.
Responder

Post mais votado

08/01/2016

Opa John,

O ideal seria que você especificasse melhor a situação. Entendemos mais ou menos o que você quer fazer, mas precisamos de mais detalhes...

De que se tratam as pesquisas? Monta uma lista com os detalhes de cada uma, as entidades envolvidas e o retorno esperado...
Responder

Mais Posts

03/01/2016

Eduardo Pessoa

Peguei essa estrutura um pouco parecida.


@Column(nullable = false, unique = true)
	private String nome;
	
	@Column(nullable = false, unique = true)
	private String email;
	
	@Column(name = "senha_hash", nullable = false)
	private String senha;
	
	@Column(name = "data_cadastro", nullable = false)
	private LocalDate dataCadastro;
	
	@Enumerated(EnumType.STRING)
	@Column(nullable = false)
	private Perfil perfil;
	
	@OneToOne(cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
	@JoinColumn(name = "avatar_id")
	private Avatar avatar;

Responder

03/01/2016

John Lima

hummm mais chegou ha alguma solução
Responder

03/01/2016

John Lima

acho que o melhor seria usar um join fetch com distinct
Responder

08/01/2016

Eduardo Pessoa

Desculpa apenas peguei essa estrutura de select que vi em uma video aula e achei que fosse te ajudar.
Responder

08/01/2016

John Lima

Então Diogo eu tenho uma Tabela Pessoa, que por sua vez tem uma Lista de Endereço uma lista de contato e uma lista de telefone, então gostaria por exeplos de seleciona todos os cliente que são da cidade X
Responder

11/01/2016

Diogo Souza

Entendi, mas para isso também precisamos saber o modelo da classe PessoaEndereco, pois imagino que os dados da cidade estejam dentro dela, certo?
Responder

11/01/2016

John Lima



private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "ID")
private Integer id;
@Column(name = "LOGRADOURO")
private String logradouro;
@Column(name = "NUMERO")
private String numero;
@Column(name = "COMPLEMENTO")
private String complemento;
@Column(name = "BAIRRO")
private String bairro;
@Column(name = "CIDADE")
private String cidade;
@Column(name = "CEP")
private String cep;
@Column(name = "FONE")
private String fone;
@Column(name = "MUNICIPIO_IBGE")
private Integer municipioIbge;
@Column(name = "UF")
private String uf;
@Column(name = "PRINCIPAL")
private String principal;
@Column(name = "ENTREGA")
private String entrega;
@Column(name = "COBRANCA")
private String cobranca;
@Column(name = "CORRESPONDENCIA")
private String correspondencia;
@JoinColumn(name = "ID_PESSOA", referencedColumnName = "ID")
@ManyToOne(optional = false)
private Pessoa pessoa;
Responder

13/01/2016

Ronaldo Filho

Bom dia Grande.

Grande essa consulta tu vai montar ela na mão ou está usando alguma framework, por que se for na mão você vai tem um pouco de trabalho, você teria que ter em mãos as chaves das tabelas (joins) que servirão como filtro, pra montar o sql segue o padrão estabelecido pelo shema de seu banco de dados, mas caso você esteja usando um modelo MVC, com classes Repository ou DAO, ou algum framework que utilize esse padrão e que monte interfaces de métodos baseados na nomeação dos mesmos, esse processo pode ser simplificado. Manda essas informações, qual o padrão que você está usando?, se está usando o framework e qual é?, pra que a gnt possa basear a resposta com mais clareza.
Responder

13/01/2016

John Lima

Modelo Mvc padrão dao bom eu fiz meu que um armengo para fazer não queria deixa assim



@Override
public List<Pessoa> getPessoas(int first, int pageSize, String sortField, SortOrder sortOrder, String nome, String cidade, String cpf, String uf, String tipo) {
String sql = "";
String where = "where p.nome like ?1 and f.cpf like ?2";
int i = 2;
List<Object> objs = new LinkedList<>();
objs.add(nome);
objs.add(cpf);
if (tipo.equals("F")) {

sql = "SELECT DISTINCT p FROM Pessoa p "
+ "inner join p.pessoaFisica f "
+ "LEFT join p.listaPessoaEndereco e ";

if (cidade.trim().length() > 0) {
i += 1;
where += " and e.cidade like ?" + i;
objs.add(cidade);
}
if (uf.trim().length() > 0) {
i += 1;
where += " and e.uf like ?" + i;
objs.add(uf);
}

} else {

}

return getList(Pessoa.class, first, pageSize, sortField, sortOrder, sql + where, objs.toArray());
}



Responder

13/01/2016

Ronaldo Filho

Entendi, no caso grande, você pode organizar criando um método que se baseia em variáveis alimentada por outros métodos na mesma classe.

Importante: Leia o comentário dos códigos.

Exemplo:

String[] tabelas = new String[10];
String[] camposFiltro = new String[20];

public classe leftJoinTabelapessoaFisica(String[] campos){ //esse método se repete para as tabelas que possam ser usadas como left join
    tabelas[tabelas.getSize()] = "PessoaFisica p on p.campo = Pessoa.campo";
    camposFiltros[camposFiltros.getSize()] = campos //-> esse array tem que vir alimentado pelo campo e pela condição ex.: campo = "valor" ou campo <> "valor";
    
    return this; // esses métodos retornam a classe onde foram criados para que se possa chamar um método pelo outro
}



Depois de criar esses métodos você terá que criar o que você fez.

public List<Pessoa> getList(){
 String sql = null;

if (tabelas.getSize() > 0 && campos.getSize() > 0){
      sql = " SELECT DISTINCT p FROM Pessoa p ";
     
     for(int i = 0; i < tabelas.getSize(); i++){
          sql += tabelas[i]+" ";
     }     

     sql += " where ";

     for(int i = 0; i < campos.getSize(); i++){          
          sql += campos[i];
          if (i <> campos.getSize()-1){
            sql +=" and "
          }
     }
  }
return getList(Pessoa.class, first, pageSize, sortField, sortOrder, sql + where, objs.toArray());
}



Assim você não precisa trabalhar toda a informação dentro do mesmo método, você coordena quais tabelas serão inseridas sem a necessidade da assinatura muita extensa para um único método.

Espero ter explicado direito kkkkkk, mas qualquer coisa pode perguntar, sem problema, blz.

Só lembrando que esse código eu fiz por aqui mesmo, não criei ele em nenhuma IDE, provavelmente dê alguma falha na hora de implementar, mas creio que seja falha pequena
Responder

13/01/2016

John Lima

Realmente o código fica mais limpo, então minha linha de racíocinio estava certo ?
no primeiro momento eu iria usar um Map<String,Object> que no caso seria map.put("tabela",valor)
Responder

13/01/2016

Ronaldo Filho

Você pode usar realmente o map, fica mais limpo e mais organizado o código.
Responder

13/01/2016

John Lima

Blza Ronaldo e obrigado pela ajuda estava batendo a cabeça pois no primeiro momento pensei que só com a query poderia resolver a situação.
Responder

13/01/2016

Ronaldo Filho

Fica sussa, é complicado por que as vezes estamos com a cabeça quente focada no código e não saí nada, mas com um empurrãozinho da tudo certo, já passei muito por isso, e lembre que existem ótimos profissionais acompanhando o fórum para ajudar, é sempre bom pedir a ajuda do pessoal aqui. Foi boa.
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira