Java Generic Type with extends和T using Hibernate

时间:2015-03-02 13:31:39

标签: java hibernate generics

我有一个像这样的简单界面。

public interface EntityClass
{    
    public void setId(final Integer id);    
    public Integer getId();    
}

和一个班级

public Student implements EntityClass

我正在尝试编写一个使用泛型类型T但仍然是EntityClass a EntityClass subclass的实例的类。

public abstract class CustomizableQueriesForClazzAndFields<T extends EntityClass>

那是该类中的项目,我想要一个像这样的方法。

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);

同样给我List,但我不知道是否有可能捕获或捕获泛型类型的传递CustomizableQueriesForClazzAndFields<Student>并传递给of()方法创建org.hibernate.Criteria object我不能只传递T值,因为在我的图表中我想成为EntityClass的子类,而不只是raw T value.

我需要捕获或捕获

CustomizableQueriesForClazzAndFields<Student> 

Student generic type.

如果这可能,或者我的英语很差,我会抱歉。

感谢委内瑞拉的许多和最好的问候..

1 个答案:

答案 0 :(得分:1)

方法1:

我不确定我是否完全理解你的问题,但我觉得你想要这样的事情:

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) {
     ...
  }
}

编译器无法在运行时仅根据推断的数据创建/检索T的实例,因此您必须以某种方式传递该信息,例如作为参数:

List<Student> l = getMultipleClazzWithFields(Student.class, "field1", "field2");

方法2:

您可以为每个Class<T>创建子类,而不是将T作为参数传递,例如class StudentQueries extends CustomizableQueriesForClazzAndFields<Student>,然后使用反射来查找T的类型。但请注意,这只适用于定义具体类型T的子楼级。

哪种方法更好取决于您的需求,但如果只是针对该查询,我会将实体的类作为调用参数传递,并跳过所有其他需要的子类。

更新:如果你想实现第二种方法(子类),请查看一些关于如何使用反射来查找T的类型的代码:{{3 }}