Java Hibernate抛出具有给定正确类名的QuerySyntaxException
我有一门Java Hibernate抛出具有给定正确类名的QuerySyntaxException,java,hibernate,resteasy,Java,Hibernate,Resteasy,我有一门产品课程 @Entity public class Product { . . public Product() { } . . } 通用道 public class GenericDao<T> { private Class<T> type; @Inject protected EntityManager entityManager; public GenericDao() { }
产品
课程
@Entity
public class Product {
.
.
public Product() { }
.
.
}
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();
}
}
<?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>
org.hibernate.jpa.HibernatePersistenceProvider
为避免冲突,请在实现类中指定类和实体管理器。例如:
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();
}
公共抽象类GenericDao{
私人课堂;
公共通用DAO(类clazz){
this.clazz=clazz;
}
公共T getById(长键){
返回getEntityManager().find(clazz,key);
}
受保护的抽象EntityManager getEntityManager();
}
然后,您的实现类:
public class ProductDao extends BaseDao<Product> {
@PersistenceContext
private EntityManager em;
public ProductDao(){
super(Product.class);
}
/**
* {@inheritDoc}
*/
@Override
protected EntityManager getEntityManager() {
return em;
}
}
公共类ProductDao扩展了BaseDao{
@持久上下文
私人实体管理者;
公共产品{
超级(产品类);
}
/**
*{@inheritardoc}
*/
@凌驾
受保护的EntityManager getEntityManager(){
返回em;
}
}
尝试使用全名而不是simpleClassName
如下
“FROM”+type.getName()
你的
persistence.xml
看起来像什么?@RobbyCornelissen我已经包括了persistence.xml
config@Azola您在哪里声明类产品包含映射?我的意思是,在您的一个配置文件中,您必须指出产品(或其包)必须由持久性管理器管理。您可以在这里看到一个示例,您的persistence.xml
无效。它没有openingproperties
标记。不,这会返回完整的类名,但包不工作?或者你使用它得到了相同的异常?我得到了ArrayIndexOutOfBoundsCeption抽象方法需要在抽象类中,但这对meIndeed有效:)该方法无论如何都应该是抽象的。我甚至建议使用通用接口和通用抽象实现。然后,您的具体类将扩展这个公共抽象实现。
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;
}
}