Hibernate抛出一个QuerySyntaxException与给定的正确的类名 [英] Hibernate throwing a QuerySyntaxException with correct class name given

查看:61
本文介绍了Hibernate抛出一个QuerySyntaxException与给定的正确的类名的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  1. 我有一个Product类;

@Entity
public class Product {
    .
    .
    public Product() { }
    .
    .
}

  • 通用DAO;

  • A generic 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();
        }
    }
    

  • 产品DAO类;

  • A Product DAO class;

    public class ProductDao extends BaseDao<Product> { }

    产品JAX-RS服务;

    A product JAX-RS service;

    @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;

    When I run the app and make a call to the endpoint I get a nice 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>
    

    推荐答案

    为避免冲突,请在实现类中指定您的类和实体管理器.例子:

    To avoid conflicts, specify your Class and entity manager in implementation classes. Example :

    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();
    }
    

    然后是您的实现类:

    public class ProductDao extends BaseDao<Product> { 
        @PersistenceContext
        private EntityManager em;
    
        public ProductDao(){
            super(Product.class);
        }
    
            /**
         * {@inheritDoc}
         */
        @Override
        protected EntityManager getEntityManager() {
            return em;
        }
    }
    

    这篇关于Hibernate抛出一个QuerySyntaxException与给定的正确的类名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆