Hibernate 抛出 QuerySyntaxException 并给出正确的 class 名称
Hibernate throwing a QuerySyntaxException with correct class name given
我有一个Product
class;
@Entity
public class Product {
.
.
public Product() { }
.
.
}
一个通用的 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 class;
public class ProductDao extends BaseDao<Product> { }
产品 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()
我有一个
Product
class;@Entity public class Product { . . public Product() { } . . }
一个通用的 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 class;
public class ProductDao extends BaseDao<Product> { }
产品 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()