Java 使用 Hibernate 的带有扩展和 T 的通用类型
Java Generic Type with extends and T using Hibernate
我有一个像这样的简单界面。
public interface EntityClass
{
public void setId(final Integer id);
public Integer getId();
}
和一个class
public Student implements EntityClass
我正在尝试编写一个 class,它使用通用类型 T
但仍然是一个 instanceof EntityClass
a EntityClass subclass
类似这样的东西。
public abstract class CustomizableQueriesForClazzAndFields<T extends EntityClass>
那是里面的项目 class 我想要这样的方法。
public List<T>getMultipleClazzWithFields(final String ...fields){return of(genericType).retrieve(fields);}
private MyCriteria of(final Class<? extends EntityClass>applyToClazz){........}
MyCriteria 是 org.hibernate.Criteria.
的包装器
在我的实现中会做这样的事情。
public final class TestCustom extends CustomizableQueriesForClazzAndFields<Student>
{
public static void main(String[] args)
{
final TestCustom clazz = new TestCustom();
final List<Student>a=clazz.getMultipleClazzWithFields("id","name","phone");
a.stream().forEach(clazz::consumer);
}
}
做这段代码我想用泛型来表示它。
public List<Student>getMultipleClazzWithFields(final String ...fields){return of(Student.class).retrieve(fields);}
但我不知道如何表示或是否可能。
public List<T>getMultipleClazzWithFields(final String ...fields){return of(genericType).retrieve(fields);}
哪个 genericType 应该表示为 Student
与 Student
相同
public final class TestCustom extends CustomizableQueriesForClazzAndFields<Student>
或表示为
public final class TestCustom extends CustomizableQueriesForClazzAndFields<School>
并且会做类似
的事情
public List<School>getMultipleClazzWithFields(final String ...fields){return of(School.class).retrieve(fields);}
因为我是这样潜水的
public List<T>getMultipleClazzWithFields(final String ...fields){return of(T).retrieve(fields);}
但是编译器踢我说。
cannot find symbol
symbol: variable T
location: class CustomizableQueriesForClazzAndFields<T>
where T is a type-variable:
T extends EntityClass declared in class CustomizableQueriesForClazzAndFields
----
(Alt-Enter shows hints)
我也试试
public abstract class CustomizableQueriesForClazzAndFields<Class<T extends EntityClass>>
但是说。
> expected
----
(Alt-Enter shows hints)
或者我怎样才能完成我想要的代码..任何工作。
因为我作为参数传递有点烦人。
更新
我想做的就是传递 EntityClass
的子类并创建。
session.createCriteria(genericType);
也给了我列表,但我不知道是否有可能捕获或捕获通用类型传递 CustomizableQueriesForClazzAndFields<Student>
并传递给 of()
方法,该方法是谁创建了 org.hibernate.Criteria object
我不能只传递一个 T
值,因为在我的图表中我想成为 EntityClass
的子 class 而不仅仅是 raw T value.
我需要捕捉或捕捉
CustomizableQueriesForClazzAndFields<Student>
Student generic type.
如果可能的话,或者我做梦对不起我糟糕的英语。
非常感谢委内瑞拉的问候..
方法一:
我不确定我是否完全理解你的问题,但我感觉你想要这样的东西:
public abstract class CustomizableQueriesForClazzAndFields<T extends EntityClass> {
public List<T> getMultipleClazzWithFields(final Class<T> clazz, final String ...fields){
return of(clazz).retrieve(fields);
}
private MyCriteria of(final Class<T> applyToClazz) {
...
}
}
编译器无法在运行时 create/retrieve T
的实例仅根据推断数据,因此您必须以某种方式传递该信息,例如作为参数:
List<Student> l = getMultipleClazzWithFields(Student.class, "field1", "field2");
方法二:
除了将 Class<T>
作为参数传递之外,您还可以为每个 T
创建子 classes,例如class StudentQueries extends CustomizableQueriesForClazzAndFields<Student>
,然后用反射找出T
的类型。请注意,这仅适用于定义 T
.
具体类型的子类
哪种方法更好取决于您的需要,但如果它只是针对该查询,我会将实体的 class 作为调用参数传递并跳过所有那些子 classes否则需要。
Update:如果你想实现第二种方法(subclasses),请查看这里的一些代码,了解如何使用反射来查找T
的类型:http://www.artima.com/weblogs/viewpost.jsp?thread=208860
我有一个像这样的简单界面。
public interface EntityClass
{
public void setId(final Integer id);
public Integer getId();
}
和一个class
public Student implements EntityClass
我正在尝试编写一个 class,它使用通用类型 T
但仍然是一个 instanceof EntityClass
a EntityClass subclass
类似这样的东西。
public abstract class CustomizableQueriesForClazzAndFields<T extends EntityClass>
那是里面的项目 class 我想要这样的方法。
public List<T>getMultipleClazzWithFields(final String ...fields){return of(genericType).retrieve(fields);}
private MyCriteria of(final Class<? extends EntityClass>applyToClazz){........}
MyCriteria 是 org.hibernate.Criteria.
的包装器在我的实现中会做这样的事情。
public final class TestCustom extends CustomizableQueriesForClazzAndFields<Student>
{
public static void main(String[] args)
{
final TestCustom clazz = new TestCustom();
final List<Student>a=clazz.getMultipleClazzWithFields("id","name","phone");
a.stream().forEach(clazz::consumer);
}
}
做这段代码我想用泛型来表示它。
public List<Student>getMultipleClazzWithFields(final String ...fields){return of(Student.class).retrieve(fields);}
但我不知道如何表示或是否可能。
public List<T>getMultipleClazzWithFields(final String ...fields){return of(genericType).retrieve(fields);}
哪个 genericType 应该表示为 Student
与 Student
相同
public final class TestCustom extends CustomizableQueriesForClazzAndFields<Student>
或表示为
public final class TestCustom extends CustomizableQueriesForClazzAndFields<School>
并且会做类似
的事情public List<School>getMultipleClazzWithFields(final String ...fields){return of(School.class).retrieve(fields);}
因为我是这样潜水的
public List<T>getMultipleClazzWithFields(final String ...fields){return of(T).retrieve(fields);}
但是编译器踢我说。
cannot find symbol
symbol: variable T
location: class CustomizableQueriesForClazzAndFields<T>
where T is a type-variable:
T extends EntityClass declared in class CustomizableQueriesForClazzAndFields
----
(Alt-Enter shows hints)
我也试试
public abstract class CustomizableQueriesForClazzAndFields<Class<T extends EntityClass>>
但是说。
> expected
----
(Alt-Enter shows hints)
或者我怎样才能完成我想要的代码..任何工作。
因为我作为参数传递有点烦人。
更新
我想做的就是传递 EntityClass
的子类并创建。
session.createCriteria(genericType);
也给了我列表,但我不知道是否有可能捕获或捕获通用类型传递 CustomizableQueriesForClazzAndFields<Student>
并传递给 of()
方法,该方法是谁创建了 org.hibernate.Criteria object
我不能只传递一个 T
值,因为在我的图表中我想成为 EntityClass
的子 class 而不仅仅是 raw T value.
我需要捕捉或捕捉
CustomizableQueriesForClazzAndFields<Student>
Student generic type.
如果可能的话,或者我做梦对不起我糟糕的英语。
非常感谢委内瑞拉的问候..
方法一:
我不确定我是否完全理解你的问题,但我感觉你想要这样的东西:
public abstract class CustomizableQueriesForClazzAndFields<T extends EntityClass> {
public List<T> getMultipleClazzWithFields(final Class<T> clazz, final String ...fields){
return of(clazz).retrieve(fields);
}
private MyCriteria of(final Class<T> applyToClazz) {
...
}
}
编译器无法在运行时 create/retrieve T
的实例仅根据推断数据,因此您必须以某种方式传递该信息,例如作为参数:
List<Student> l = getMultipleClazzWithFields(Student.class, "field1", "field2");
方法二:
除了将 Class<T>
作为参数传递之外,您还可以为每个 T
创建子 classes,例如class StudentQueries extends CustomizableQueriesForClazzAndFields<Student>
,然后用反射找出T
的类型。请注意,这仅适用于定义 T
.
哪种方法更好取决于您的需要,但如果它只是针对该查询,我会将实体的 class 作为调用参数传递并跳过所有那些子 classes否则需要。
Update:如果你想实现第二种方法(subclasses),请查看这里的一些代码,了解如何使用反射来查找T
的类型:http://www.artima.com/weblogs/viewpost.jsp?thread=208860