Hibernate Query API和Java 1.5 / Generics

时间:2009-04-08 14:09:46

标签: java hibernate generics

Hibernate中的所有API都是1.4,因此不使用java泛型。

所以我想知道以下是多么“安全”:(前提条件:name列是数据类型String,或者至少与String兼容)

@SuppressWarnings("unchecked")
public List<String> getAll() {
    Query q = session.createQuery(
        "select name from Customers");
    return q.list();    
}

来自Queryi API(org.hibernate.Query.list())javadoc。

"Return the query results as a List. If the query contains multiple results pre row, the results are returned in an instance of Object[]. "

3 个答案:

答案 0 :(得分:3)

Java泛型使用类型擦除,因此在运行时,ListList<String>List<Integer>之间没有区别。一切都只是List。在编译时,编译器将强制执行模板参数类型,但在运行时的封面下,您有一个List

实际上,如果您尝试使用反射来查找模板参数类型,则不能。

答案 1 :(得分:3)

只要您确定查询“不包含每行多个结果”,它就会安全。 (我不熟悉查询,因此我不确定在这种情况下是否会发生这种情况。)如果一行确实包含多个结果,那么当您尝试访问它时,它将在运行时抛出ClassCastException,因为该元素将是一个Object []对象而不是String对象。

答案 2 :(得分:2)

在Java中,泛型实际上是擦除,这只不过是编译魔术。用作泛型类型参数的类型在运行时是未知的。因此,如果返回的列表实现了List接口,则转换应该成功,但编译器可能会向您发出警告。