亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 188 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號