Bom dia Rodrigo. Estou com algum erro na query que não consigo encontrar. Consegue me ajudar?
@Entity
@Table(name = "produtos")
@Inheritance(strategy = InheritanceType.JOINED)
@NamedQuery(name = "Produto.produtosPorCategoria", query = "SELECT p FROM Produto p WHERE p.categoria.nome = :nome")
public class Produto {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
private String descricao;
private BigDecimal preco;
private LocalDate dataCadastro = LocalDate.now();
@ManyToOne
private Categoria categoria;
public Produto(String nome, String descricao, BigDecimal preco, Categoria categoria) {
this.nome = nome;
this.descricao = descricao;
this.preco = preco;
this.categoria = categoria;
}
public Produto() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public BigDecimal getPreco() {
return preco;
}
public void setPreco(BigDecimal preco) {
this.preco = preco;
}
}
public class ProdutoDao {
private EntityManager em;
public ProdutoDao(EntityManager em) {
this.em = em;
}
public void cadastrar(Produto produto) {
this.em.persist(produto);
}
public Produto buscarPorId(Long id) {
return em.find(Produto.class, id);
}
public List<Produto> buscarTodos() {
String jpql = "SELECT p FROM Produto p";
return em.createQuery(jpql, Produto.class).getResultList();
}
public List<Produto> buscarPorNome(String nome) {
String jpql = "SELECT p FROM Produto p WHERE p.nome = :nome"; // Outra maneira de colocar o parâmetro é colocando ?1 e substituir no setparameter
return em.createQuery(jpql, Produto.class)
.setParameter("nome", nome)
.getResultList();
}
public List<Produto> buscarPorNomeDaCategoria(String nome) {
return em.createNamedQuery("Produto.produtosPorCategoria", Produto.class)
.setParameter("nome", nome)
.getResultList();
}
public BigDecimal buscarPrecoDoProdutoComNome(String nome) {
String jpql = "SELECT p.preco FROM Produto p WHERE p.nome = :nome";
return em.createQuery(jpql, BigDecimal.class)
.setParameter("nome", nome)
.getSingleResult();
}
}
public class CadastroDeProduto {
public static void main(String[] args) {
cadastrarProduto();
EntityManager em = JPAUtil.getEntityManager();
ProdutoDao produtoDao = new ProdutoDao(em);
Produto p = produtoDao.buscarPorId(1L);
System.out.println(p.getPreco());
List<Produto> todos = produtoDao.buscarPorNomeDaCategoria("CELULARES");
todos.forEach(p2 -> System.out.println(p2.getNome()));
// List<Produto> nome = produtoDao.buscarPorNome("Xiaomi Redmi");
// nome.forEach(p3 -> System.out.println(p3.getNome()));
//
// List<Produto> nome = produtoDao.buscarPorNomeDaCategoria("CELULARES");
// nome.forEach(p4 -> System.out.println(p4.getNome()));
BigDecimal precoDoProduto = produtoDao.buscarPrecoDoProdutoComNome("Xiaomi Redmi");
System.out.println("Preco do Produto : " + precoDoProduto);
}
private static void cadastrarProduto() {
Categoria celulares = new Categoria("CELULARES");
Produto celular = new Produto("Xiaomi Redmi", "Muito legal", new BigDecimal("800"), celulares);
EntityManager em = JPAUtil.getEntityManager();
ProdutoDao produtoDao = new ProdutoDao(em);
CategoriaDao categoriaDao = new CategoriaDao(em);
em.getTransaction().begin();
categoriaDao.cadastrar(celulares);
produtoDao.cadastrar(celular);
em.getTransaction().commit();
em.find(Categoria.class, new CategoriaId("CELULARES", "xpto"));
em.close();