Bom Dia.
Digamos que eu tenho duas tabelas:
Fornecedor e Produto.
Onde eu tenho uma relação de 1 para N.
Portanto no ORM de Fornecedor terei um mapeamento do tipo OneToMany, e o atributo deste
relacionamento é um List.
No ORM Produto, tenho um mapeamento do tipo ManyToOne, e o atributo deste relacionamento
é um objeto do tipo Fornecedor.
E na consulta, quero retornar o Fornecedor do código 1 e seus produtos que tenham código
entre 10 e 15.
Fazendo a consulta de Produto para Fornecedor, ficaria assim:
String sql = "SELECT p FROM Produto p WHERE p.fornecedor.codigo = 1 AND p.codigo >= 10 AND p.codigo <= 15";
Como faço para fazer o inverso, ou seja de Fornecedor, onde tenho um List para
Produto.
Como especifico que neste List, só quero os produtos que tenham o id entre 10 e 15?
Muitos Simples:
Classe Fornecedor
@Entity(name="fornecedor")
public class Fornecedor implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(nullable=false, name="codigo")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer codigo;
@Column(name="nome")
private String nome;
@OneToMany(mappedBy="fornecedor")
private List<Produto> produtos;
// Getters e Setttes abaixo ....
Classe Produto
@Entity(name="produto")
public class Produto implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(nullable=false, name="codigo")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer codigo;
@Column(name="nome")
private String nome;
@ManyToOne
@JoinColumn(name="codigo_fornecedor")
private Fornecedor fornecedor;
JPQL
StringBuilder sb = new StringBuilder();
sb.append("SELECT f FROM ");
sb.append(Fornecedor.class.getName()).append(" f ");
sb.append("LEFT JOIN f.produtos p ");
sb.append("WHERE f.codigo = 1 AND p.codigo >= 10 AND p.codigo <=15");
Ou seja, basta usar o IN, LEFT, ou RIGHT no List<> do Objeto.
Créditos César Oliveira
Abraço.