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