Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate查询API和Java 1.5/Generics_Java_Hibernate_Generics - Fatal编程技术网

Hibernate查询API和Java 1.5/Generics

Hibernate查询API和Java 1.5/Generics,java,hibernate,generics,Java,Hibernate,Generics,Hibernate中的所有API都来自1.4,因此没有使用java泛型 所以我想知道以下内容有多“安全”:(前提条件:name列的数据类型为String,或者至少与String兼容) @SuppressWarnings(“未选中”) 公共列表getAll(){ Query q=session.createQuery( “从客户中选择名称”); 返回q.list(); } 来自QueryIAPI(org.hibernate.Query.list())javadoc 在Java中,泛型实际上是擦除

Hibernate中的所有API都来自1.4,因此没有使用java泛型

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

@SuppressWarnings(“未选中”)
公共列表getAll(){
Query q=session.createQuery(
“从客户中选择名称”);
返回q.list();
}
来自QueryIAPI(org.hibernate.Query.list())javadoc


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

Java泛型使用类型擦除,因此在运行时,
列表
列表
列表
之间没有区别。所有这些都只是列表。在编译时,编译器将强制执行模板参数类型,但在运行时的封面下,有一个
列表


事实上,如果您试图使用反射来查找模板参数类型,则无法

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

(Class)((ParameterizedType)getClass().getGenericSuperclass().getActualTypeArguments()[0];如何获取模板参数,例如,如果您有一个hbm查询,其中包含如下连接:
来自Item i left join i.preferences p,其中p为null
。在这里,它将选择项目和它的首选项行,这样您将得到多个结果。为了避免这种情况,您需要指定只返回项目:
select i from Item i left join i.preferences p其中p为null
当然,该转换将成功,但我认为这没有抓住要点。当您试图从列表中实际获取对象时,您希望确保它们实际上是
String
s.@matrixprog,编译器生成的强制转换将在运行时强制执行此假设。请注意,作者明确声明数组中的对象将是字符串。
@SuppressWarnings("unchecked")
public List<String> getAll() {
    Query q = session.createQuery(
        "select name from Customers");
    return q.list();    
}