2017-01-25 82 views
-1
  1. 我有Product類;休眠拋出QuerySyntaxException給出正確的類名稱

    @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> 
+1

什麼是你的'persistence.xml'是什麼樣子? –

+0

@RobbyCornelissen我已經包括'persistence.xml' config – Laazo

+0

@Azola你在哪裏聲明瞭類Product包含映射?我的意思是,在你的一個配置文件中,你必須指明產品(或其包)必須由持久性管理器來管理。 – RubioRic

回答

0

爲了避免衝突,指定實現類的類和實體管理器。例如:

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; 
    } 
} 
+0

抽象方法需要在抽象類中,但是這對我有用 – Laazo

+0

確實:)方法應該是抽象的。我甚至會建議有一個通用的接口和一個通用的抽象實現。然後你的具體類將擴展這個通用的抽象實現。 – user2447161

0

試圖把全名,而不是simpleClassName。

如下

「FROM」 + type.getName()

+0

不,這會返回完整的類名稱與包 – Laazo

+0

是不是無法正常工作?或者你使用它得到相同的異常? –

+0

我得到一個ArrayIndexOutOfBoundsException – Laazo

相關問題