使用createQuery()。list?
后是否可以避免强制转换警告//Type safety: The expression of type List needs unchecked conversion to conform to List<User>
List<User> user = (List<User>) session.createQuery("select u from User u").list();
我希望找到一个通过泛型参数或方法参数指定目标对象的方法,如下所示:
List<User> user = session.createQuery("select u from User u").list(User.class);
答案 0 :(得分:4)
最重要的是要记住警告是由你的编译器引起的,而不是hibernate - 你可以告诉你的编译器忽略未实现的泛型。通过使用HQL,我们以类型安全的方式查询数据,遗憾的是,java无法验证。
有许多方法可以解决hibernate转换的语法丑陋问题,例如:
1)使用@suppressWarnings进行投射或
2)使用Collections.checkedList方法创建新列表。
另请参阅:How to avoid type safety warnings with Hibernate HQL results?
答案 1 :(得分:1)
如果你使用EntityManager
,你可以避免警告,但不确定它是否能让事情变得更好:
EntityManager em = provider.get(); // your code will probably be different here
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<T> query = builder.createQuery(type); // your Class<T>
Root<T> root = query.from(type); // your Class<T>
query.select(root);
TypedQuery<T> typedQuery = em.createQuery(query);
typedQuery.getResultList(); // List<T>
编辑:很明显,有更好的方法来设置它......
答案 2 :(得分:0)
从JPA 2.0开始,EntityManager添加了以下重载的createQuery()/ createNamedQuery()方法,这些方法返回TypedQuery来解决问题:
TypedQuery<T> entityManager.createQuery(CriteriaQuery<T> criteriaQuery)
TypedQuery<T> entityManager.createQuery(java.lang.String qlString, java.lang.Class<T> resultClass)
TypedQuery<T> entityManager.createNamedQuery(java.lang.String name, java.lang.Class<T> resultClass)
示例:
@Repository
public class UsersRepositoryImpl implements IUsersRepository {
@PersistenceContext(unitName="SPRING_BOOT_JPA_DS_PU")
private EntityManager entityManager;
@Override
public List<User> listUser() {
String queryString = "SELECT U FROM " + User.class.getName() + " U";
// Query query =entityManager.createQuery(queryString);
// Use TypedQuery instead of Query
// Requires JPA 2.0
TypedQuery<User> query = entityManager.createQuery(queryString, User.class);
List<User> resultList = query.getResultList();
return resultList;
}
}