问题标题感觉非常笨拙。我很感激编辑
我正在尝试创建一个可重复使用的查询,以返回由指定的List
指定的某种String
个对象。
这不会起作用,但我想它会说明我想要做的事情:
public List<?> getAll(String type) {
Class clazz = Class.forName(type);
return (List<clazz>) em.createQuery("SELECT t from " + type + " t").getResultList();
}
答案 0 :(得分:5)
尝试使用类型的类:
public <T> List<T> getAll(Class<T> type) {
return em.createQuery("SELECT t from " + type.getSimpleName() + " t").getResultList();
}
请注意,这仍会生成警告,因为getResultList()
会返回原始列表。
修改:
如果你只有一个完全限定的类名,即你需要调用Class.forName()
,那么在编译时就无法知道该类 - 因为泛型(几乎)只是一个编译时功能(提示:在这种情况下,他们无济于事。
您仍然可以使用Class.forName()
检索的类调用泛型方法,如下所示:
List<?> l = getAll( Class.forName( typeName ));
如果它只是用于查询,您可能也不需要获取类对象(但是,首先检查该字符串是否是现有类的名称可能是有意义的)。在这种情况下,您的方法可能如下所示:
public List<?> getAll(String type) {
return em.createQuery("SELECT t from " + type + " t").getResultList();
}
此变体还允许您传入完全限定的类名或实体名称,即它会更灵活。
或者您可以返回List<Object>
,这将允许您将更多对象添加到列表中(但要注意,您可以添加任何内容)。
话虽这么说,我会尽可能使用第一个选项,第二个选项在编译时具体类型(或至少某些接口)未知时作为回退。