ajuda com Query Hibernate
02/01/2016
0
@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
Post mais votado
08/01/2016
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...
Diogo Souza
Mais Posts
03/01/2016
Eduardo Pessoa
@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;
08/01/2016
Eduardo Pessoa
08/01/2016
John Lima
11/01/2016
Diogo Souza
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;
13/01/2016
Ronaldo Filho
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.
13/01/2016
John Lima
@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());
}
13/01/2016
Ronaldo Filho
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.
13/01/2016
John Lima
no primeiro momento eu iria usar um Map<String,Object> que no caso seria map.put("tabela",valor)
13/01/2016
Ronaldo Filho
13/01/2016
John Lima
13/01/2016
Ronaldo Filho
Clique aqui para fazer login e interagir na Comunidade :)