在下面的代码中,我试图获得一个包含数据库中所有产品的产品列表:
public List<Products> getAllProducts() throws Exception{
try{
List<Products> products ;
org.hibernate.Transaction tx = session.beginTransaction();
products = session.createSQLQuery("SELECT * FROM Products").list();
if(products.size() > 0)
{
return products;
}
return null;
}
catch(Exception e)
{
throw e;
}
}
然而抛出了这个异常:
[Ljava.lang.Object; cannot be cast to mediatek.Products
答案 0 :(得分:37)
List<Products> list = session.createCriteria(Products.class).list();
这将为您提供数据库
中产品表的所有记录答案 1 :(得分:7)
您的答案不仅会添加强制转换,还会从SQL切换到HQL。由于您的第二个查询是在HQL中,Hibernate能够使用映射信息来知道要返回的类。这是在Hibernate中执行操作的首选方法,但如果由于某种原因必须使用SQL,则可以实现相同的目的:
(List<Products>)session.createSQLQuery("SELECT * FROM Products").addEntity(Products.class).list();
答案 2 :(得分:0)
忘记输入强制转换查询。它现在正在运作。
List<Products> products = (List<Products>) session.createQuery("from Products").list();
答案 3 :(得分:0)
例如,您有代码:
Session session = getSessionFactory().openSession();
Transaction transaction = null;
try {
SQLQuery sqlQuery = session.createSQLQuery("SELECT * FROM schema.yourtable WHERE param = :param");
sqlQuery.setString("param", "someParam");
如果下一步是:
List list = sqlQuery.list();
您将收到带有行的列表。您可以在调试中看到Entity.class参数,但可以通过实体将其强制转换为List:
List<Entity> list = (List<Entity>) sqlQuery.list();
这时将是ClassCastException!
如果您需要收到带有实体的列表,则必须将实体类型添加到sql查询中:
List<Entity> list = (List<Entity>)sqlQuery.addEntity(Entity.class).list();
仅此而已。希望有人能帮忙。
答案 4 :(得分:0)
如果使用sql查询,则应在查询的最后添加此行以获取所需的列表:
.setResultTransformer(Transformers.aliasToBean(testDTO.class)).list();
答案 5 :(得分:0)
在Hibernate 5中,不建议使用session.createCriteria
方法。
您将需要使用CriteriaBuilder
并从那里查询以获取通用的产品列表,而不只是List
。
进口
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
代码
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Products> criteria = builder.createQuery(Products.class);
criteria.from(Products.class);
List<Products> products = session.createQuery(criteria).getResultList();