为了账号安全,请及时绑定邮箱和手机立即绑定

Java Hibernate Spring - 具有默认实现的服务接口

Java Hibernate Spring - 具有默认实现的服务接口

当年话下 2024-01-05 16:19:23
我有一个使用 hibernate 的 Java 数据库应用程序,其中不同的类具有相同的属性(此处:“active”)。在接口中,有一个函数可以根据这样的属性(活动)从数据库中检索条目。到目前为止,我正在这样做://interfacepublic interface ObjSvcIntf {   default <Entity> ArrayList<Entity> get(Boolean active);}//implementation 1public class ObjCarSvc implements ObjSvcIntf {   @SuppressWarnings("unchecked")   @Override   public ArrayList< ObjCar > get(Boolean active) {       @SuppressWarnings("rawtypes")       Query query = DB.s.createQuery("from " + ObjCar.class.getSimpleName() + " where active = :active");       query.setParameter("active", active);       if (!query.list().isEmpty()) {           return (ArrayList< ObjCar >) query.list();         } else {           return null;       }   }//implementation 1public class ObjPersonSvc implements ObjSvcIntf {   @SuppressWarnings("unchecked")   @Override   public ArrayList< ObjPerson > get(Boolean active) {       @SuppressWarnings("rawtypes")       Query query = DB.s.createQuery("from " + ObjPerson.class.getSimpleName() + " where active = :active");       query.setParameter("active ", active);       if (!query.list().isEmpty()) {           return (ArrayList< ObjPerson >) query.list();          } else {           return null;       }   }正如您所看到的,每个实现类中都有很多冗余代码,我想避免这种情况。因此,我想要的是在接口中拥有一个通用的默认函数,该函数将为接口的每个实现返回相同的值(当然,除非被实现类覆盖)。即,类似这样的东西(当然,这不起作用):public interface ObjSvcIntf {   default <Entity> ArrayList<Entity> get(Boolean active) {       @SuppressWarnings("rawtypes")       Query query = DB.s.createQuery("from " + Entity.class.getSimpleName() + " where active = :active");       query.setParameter("active", active);       return (ArrayList<Entity>) query.list();   }}我在这里缺乏正确的理解,如何以正确的方式在接口中创建函数,以便能够在不同的上下文/不同的类中使用它。我该如何调整界面中的功能来实现这一点?
查看完整描述

3 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

您可以创建一个抽象函数来返回子类的对象。像这样的东西会起作用。这是示例代码,其中接口返回作为实现该接口的类的对象列表。


public interface ObjSvcIntf<E> {

    default List<E> get(Boolean active) {

        var list = new ArrayList<E>();

        list.add(self());

        return list;

    }


    E self(); // function to return the sub class instance

}


查看完整回答
反对 回复 2024-01-05
?
12345678_0001

TA贡献1802条经验 获得超5个赞

我重组了该项目,将接口与其实现分开。现在,扩展接口的(抽象)实现的每个类在调用超级构造函数时都会设置类型“Class”的属性,抽象类中的每个函数都引用该属性。


有没有更好的办法?这种方法有哪些潜在问题?


界面:


public interfaceObjSvcIntf {


    <Entity> Object getById(Long id);


}

实现抽象类:


public abstract class ObjSvcImpl implements ObjSvcIntf {


    public Class<?> servicedClass;


    // CONSTRUCTOR

    public ObjSvcImpl(Class<?> servicedClass) {

        this.servicedClass = servicedClass;

    }


    @Override

    public <Entity> Object getById(Long id) {

         return DB.getById(this.servicedClass, id);

    }

}

服务等级:


public class ObjCarSvc extends ObjSvcImpl {


    public ObjCarSvc() {

        super(ObjCar.class);

    }


}

型号类别:


@Entity

@Table(name = "OBJ_CAR")

public class ObjCar implements Serializable {


    private static final long serialVersionUID = 1L;

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)

    @Column(name = "OBJ_CAR_ID")

    private Long objCarId;


    @NotNull

    @Column(name = "NAME")

    private String name;


    // Getters and Setters

}


查看完整回答
反对 回复 2024-01-05
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

public interface ObjSvcIntf<Entity> {

    default <Entity> ArrayList<Entity> get(Boolean active) {

        @SuppressWarnings("rawtypes")

        Query query = DB.s.createQuery("from " + getImplClass().getSimpleName() + " where active = :active");

        query.setParameter("active", active);

        return (ArrayList<Entity>) query.list();

    }

    Class getImplClass();

}

您可以为每个实现提供与为泛型类型提供的相同的类。


查看完整回答
反对 回复 2024-01-05
  • 3 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信