JPA+Hibernate: Error removing from an entity

Asked

Viewed 140 times

0

I’m getting this Exception while doing the remove, already broke my head looking for what and

Exception in thread "main" java.lang.Runtimeexception: Error Interpreting query [delete from Book Where id = 3]; this may indicate a semantic (user query) problem or a bug in the parser at application.dao.Daogenerico.removeById(Daogenerico.java:39) at application.TestClass.main(Testclass.java:30)

NOTE: The book with ID 3 exists, the operations of UPDATE, SAVE are working perfectly.

Follows the class of DAO:

public class DaoGenerico<T extends BaseEntity> {

    private static EntityManager em = Connection.getConnection("integrator");

    public T findById(Class<T> clazz, Long id) {
        return em.find(clazz, id);
    }

    public void save_update(T entity) {
        try {
            em.getTransaction().begin();
            if (entity.getId() == null)
                em.persist(entity);
            else
                em.merge(entity);
            em.getTransaction().commit();
        } catch (Exception e) {
            em.getTransaction().rollback();
        }
    }

    public void removeById(Class<T> clazz, Long id) {
        try {
            Query query = em.createQuery("delete from " + clazz.getSimpleName() + " where id = " + id);
            query.executeUpdate();
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
    }

I have also tried to use directly with entitymanager:

public void save_update(T entity) {
    try {
        em.getTransaction().begin();
        if (entity.getId() == null)
            em.persist(entity);
        else
            em.merge(entity);
        em.getTransaction().commit();
    } catch (Exception e) {
        em.getTransaction().rollback();
    }
}

The entity:

package application.domain;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "tb_livro")
public class Livro implements Serializable, BaseEntity {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String nome;
    private String editora;
    private Integer edicao;
    private String autor;

    public Livro() {
    }

    public Livro(Long id, String nome, String editora, Integer edicao, String autor) {
        super();
        this.id = id;
        this.nome = nome;
        this.editora = editora;
        this.edicao = edicao;
        this.autor = autor;
    }

    @Override
    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 getEditora() {
        return editora;
    }

    public void setEditora(String editora) {
        this.editora = editora;
    }

    public Integer getEdicao() {
        return edicao;
    }

    public void setEdicao(Integer edicao) {
        this.edicao = edicao;
    }

    public String getAutor() {
        return autor;
    }

    public void setAutor(String autor) {
        this.autor = autor;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Livro other = (Livro) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }

}

The test class:

package application;

import java.util.List;

import application.dao.DaoGenerico;
import application.domain.Livro;
import javafx.collections.ObservableList;

public class TestClass {
    public static void main(String[] args) {
        DaoGenerico<Livro> repo = new DaoGenerico<Livro>();

        Livro livro = new Livro(null, "livro 3", "ed", 3, "autor");
        repo.save_update(livro);

        List<Livro> allLivros = repo.getList(Livro.class);

        for(Livro l : allLivros) {
            System.out.println(l.getNome());
        }

        ObservableList<Livro> obLivro = repo.convertToObservable(allLivros);

        System.out.println("Observable:");

        for(Livro l2 : obLivro) {
            System.out.println(l2.getNome());
        }

        repo.removeById(Livro.class, 3L);
    }
}

The whole project is in git: https://github.com/ragnarloth2/project-integrator/

3 answers

0

Good morning,

It looks like you are missing two points in your query before id

public void removeById(Class<T> clazz, Long id) {
        try {
            Query query = em.createQuery("delete from " + clazz.getSimpleName() + " where id = :" + id);
            query.executeUpdate();
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
    }

0

Hello, consider doing it this way:

public void removeById(Class<T> clazz, Long id) {
    try {
         Query query = em.createQuery("delete from " + clazz.getSimpleName() + " where id = :id ");
        query.setParameter("id", id)
        query.executeUpdate();
    } catch (Exception e) {
        throw new RuntimeException(e.getMessage());
    }
}

https://www.objectdb.com/java/jpa/query/jpql/delete

0

Browser other questions tagged

You are not signed in. Login or sign up in order to post.