Java 根据泛型类型进行联接

Java 根据泛型类型进行联接,java,jpa,generics,criteria,Java,Jpa,Generics,Criteria,我的RefineByBasicTaskType应该为不同的CriteriaQuery类型添加相同的条件。这可能是一项任务,也可能是一次约会。唯一的区别是,如果T是任务,则不需要连接 如何将我的RefineByBasicTaskType类用于多种类型 public class RefineByBasicTaskType<T> extends AbstractRefinement<T> { private BasicTaskType basicTaskType; publ

我的RefineByBasicTaskType应该为不同的CriteriaQuery类型添加相同的条件。这可能是一项任务,也可能是一次约会。唯一的区别是,如果T是任务,则不需要连接

如何将我的RefineByBasicTaskType类用于多种类型

public class RefineByBasicTaskType<T> extends AbstractRefinement<T> {

private BasicTaskType basicTaskType;

public Predicate addCriteriaQuery(CriteriaQuery<T> criteria, CriteriaBuilder builder, Root<T> taskRoot) {
    
    if (T instanceof Task) {
        return refineByBasicTaskType(builder,
                                     taskRoot);
    }

    return refineByBasicTaskType(builder,
                                 fetchOrCreateFirstJoin(taskRoot,"task"));
}...
公共类RefineByBasicTaskType扩展了AbstractRefinection{
私有BasicTaskType BasicTaskType;
公共谓词addCriteriaQuery(CriteriaQuery条件、CriteriaBuilder、根任务根){
if(任务的T实例){
返回refineByBasicTaskType(生成器,
taskRoot);
}
返回refineByBasicTaskType(生成器,
fetchOrCreateFirstJoin(taskRoot,“任务”);
}...

从正确的面向对象的角度来看,您正试图重新发明继承已经具备的机制:

public abstract class RefineByBasicTaskType<T> extends AbstractRefinement<T> {

  public abstract Predicate addCriteriaQuery(CriteriaQuery<T> criteria, CriteriaBuilder builder, Root<T> root);
}

从正确的面向对象的角度来看,您正试图重新发明继承已经可以实现的机制:

public abstract class RefineByBasicTaskType<T> extends AbstractRefinement<T> {

  public abstract Predicate addCriteriaQuery(CriteriaQuery<T> criteria, CriteriaBuilder builder, Root<T> root);
}

您可能有设计问题。如果不向方法添加
Class clazz
参数并执行
if(clazz.equals(Task.Class))操作,您将无法执行您试图执行的操作
,或以其他方式保留类型。
T
被擦除,因此您无法将其用于
实例或其他操作。您可能有设计问题。如果不向方法添加
类clazz
参数并执行
if(clazz.equals(Task.Class))操作,您将无法执行您试图执行的操作
,或以其他方式保留类型。
T
被擦除,因此您不能将其用于
实例或其他操作。谢谢Smutje,您的两个解决方案都很好。我使用了继承,不幸的是继承的代码更多,但更清晰谢谢Smutje,您的两个解决方案都很好。我使用了继承,它不幸的是更多的代码,但更清晰
public class RefineByWhatever extends RefineByBasicTaskType<Whatever> {
  
  @Override
  public Predicate addCriteriaQuery(CriteriaQuery<Whatever> criteria, CriteriaBuilder builder, Root<Whatever> root) {
    return refineByBasicTaskType(builder, fetchOrCreateFirstJoin(root, "task"));
  }
}
if (taskRoot.getJavaType().equals(Task.class)) {
  // ...
}