ajuda com Query Hibernate

Java

02/01/2016

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.
John Lima

John Lima

Curtidas 0

Melhor post

Diogo Souza

Diogo Souza

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...
GOSTEI 1

Mais Respostas

Eduardo Pessoa

Eduardo Pessoa

02/01/2016

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;

GOSTEI 0
John Lima

John Lima

02/01/2016

hummm mais chegou ha alguma solução
GOSTEI 0
John Lima

John Lima

02/01/2016

acho que o melhor seria usar um join fetch com distinct
GOSTEI 0
Eduardo Pessoa

Eduardo Pessoa

02/01/2016

Desculpa apenas peguei essa estrutura de select que vi em uma video aula e achei que fosse te ajudar.
GOSTEI 0
John Lima

John Lima

02/01/2016

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
GOSTEI 0
Diogo Souza

Diogo Souza

02/01/2016

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

John Lima

02/01/2016



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;
GOSTEI 0
Ronaldo Filho

Ronaldo Filho

02/01/2016

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.
GOSTEI 0
John Lima

John Lima

02/01/2016

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());
}



GOSTEI 0
Ronaldo Filho

Ronaldo Filho

02/01/2016

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
GOSTEI 0
John Lima

John Lima

02/01/2016

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)
GOSTEI 0
Ronaldo Filho

Ronaldo Filho

02/01/2016

Você pode usar realmente o map, fica mais limpo e mais organizado o código.
GOSTEI 0
John Lima

John Lima

02/01/2016

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.
GOSTEI 0
Ronaldo Filho

Ronaldo Filho

02/01/2016

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.
GOSTEI 0
POSTAR