2017-01-25 3 views
-1
  1. 私はProductクラスを持っています。正しいクラス名を指定してQuerySyntaxExceptionをスローするHibernate

    @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. A製品DAOクラス;

    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'コンフィグを含めました – Laazo

+0

@Azola Productクラスにマッピングが含まれていると宣言したことはありますか?つまり、構成ファイルの1つでは、製品(またはそのパッケージ)を持続マネージャーで管理する必要があることを示す必要があります。 – 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のフルネームを入れてみてください。 + type.getName "FROM"

以下のように

()

+0

いいえ、これはパッケージ – Laazo

+0

で完全なクラス名を返します。動作していませんか?または、同じ例外を使用していますか? –

+0

ArrayIndexOutOfBoundsExceptionが発生する – Laazo

関連する問題