Hibernate 抛出 QuerySyntaxException 并给出正确的 class 名称

Hibernate throwing a QuerySyntaxException with correct class name given

  1. 我有一个Product class;

    @Entity
    public class Product {
        .
        .
        public Product() { }
        .
        .
    }
    
  2. 一个通用的 DAO;

    public class GenericDao<T> {
    
        private Class<T> type;
    
        @Inject
        protected EntityManager entityManager;
    
        public GenericDao() { }
    
    
        public List<T> list() {
            return entityManager.createQuery("FROM " + type.getSimpleName(), type).getResultList();
        }
    }
    
  3. 一个产品 DAO class;

    public class ProductDao extends BaseDao<Product> { }

  4. 产品 JAX-RS 服务;

    @Path("/product")
    public class ProductService {
    
        @Inject
        private ProductDao productDao;
    
        @GET
        @Path("/getProducts")
        @Produces(MediaType.APPLICATION_JSON)
        public List<Product> getProducts() {
            List<Product> response = productDao.list();
            return response;
        }
    }
    

    当我 运行 应用程序调用端点时,我得到一个很好的 QuerySyntaxException;

    org.jboss.resteasy.spi.UnhandledException: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Product is not mapped [FROM Product]
    

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>

<persistence version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="mainconfig">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
       <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/awsapp" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.hbm2ddl.auto" value="create" />
            <property name="javax.persistence.jdbc.user" value="${conf.jdbc.user}" />
            <property name="javax.persistence.jdbc.password" value="${conf.jdbc.password}" />
            <property name="hibernate.show_sql" value="true" />

        </properties>
    </persistence-unit>

</persistence>

为避免冲突,请在实施 classes 中指定您的 Class 和实体管理器。示例:

public abstract class GenericDao<T> {
    private Class<T> clazz;

    public GenericDao(Class<T> clazz) {
        this.clazz = clazz;
    }

    public T getById(Long key) {
        return getEntityManager().find(clazz, key);
    }
    protected abstract EntityManager getEntityManager();
}

然后你的实现 class :

public class ProductDao extends BaseDao<Product> { 
    @PersistenceContext
    private EntityManager em;

    public ProductDao(){
        super(Product.class);
    }

        /**
     * {@inheritDoc}
     */
    @Override
    protected EntityManager getEntityManager() {
        return em;
    }
}

尝试使用全名而不是 simpleClassName。

如下

"FROM " + type.getName()