我正在尝试在Java中使用Hibernate和TypedQuery。
我尝试调用的方法的签名为
<T> TypedQuery<T> createQuery(String qlString, Class<T> resultClass)
我想像波纹管那样称呼它,但将null替换为真实实例。
Class<Tuple2<Date,String>> cls=null;
List<Tuple2<Date,String>> books=em.createQuery("select new io.vavr.Tuple2(date,title) from Book where publicationdate > '2008-01-01'",cls).getResultList();
上面的代码可以编译,但显然会因空指针异常而崩溃。
如果我对擦除的理解是正确的,那么只要我获得Class对象的实例,这将一直有效,因为所有泛型类型信息无论如何都会在运行时丢失。
有什么办法可以获取可以分配给变量cls的Class实例,以便此代码起作用?
答案 0 :(得分:0)
基于@Thomas在第一篇文章中的评论,我提出以下内容。
虽然死了似乎不是一种实例化此类Class对象的方法,但可以通过子类实现相对可读的解决方案。
在代码所在的类中,在任何函数之外添加
public static class DateStringPair extends Pair<Date,String>{
public DateStringPair(Date d,String s){super(d,s);}
}
然后呼叫变为
List<DateStringPair> books=em.createQuery(
"select new com.example.ConnectionAndQueryTest$DateStringPair(publicationDate,title) from Book where publicationDate > '2008-01-01'"
,DateStringPair.class).getResultList( );
这有一个限制,那就是Pair类不能是最终的。
尽管在查询的可读性方面不如完全泛型支持那么灵活,但可以保持查询的方便。