使用Hibernate Query.list()避免类型安全警告

时间:2011-12-28 02:11:38

标签: java hibernate casting

使用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);

3 个答案:

答案 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;
    }


    }