簡體   English   中英

如何在 crud 存儲庫的實現中編碼查詢 function

[英]How to code the query function in the implementation of a crud repository

所以通常情況下,我只有一個實現 CrudRepository 的接口並將我的 @Query 放在那里。 但是,為此我有一個 DAO class 是存儲庫和一個實現該存儲庫的 DAOImpl。 因此,我實現了我只想使用查詢並將該查詢作為字符串列表返回的方法。 我的問題是如何對實現中的部分進行編碼以僅通過該字符串列表?

public interface DealerDAO {
    /**
     * @return List of Marketing Orgs
     */
    public Map<String, MarketOrg> getMarketStructure();

    @Query(
            value="SELECT DISTINCT ...",
            nativeQuery = true)
    List<String> findDealerCode(String marketOrg, String region, String district);
}
@Service
public class DealerDAOImpl implements DealerDAO {
    @PersistenceContext
    private EntityManager em;


    public Map<String, MarketOrg> getMarketStructure() {
        HashMap<String, MarketOrg> mktOrgs = new HashMap<String, MarketOrg>();
        Query q = em.createNativeQuery("SELECT DISTINCT ....");
        List<Object[]> marketEntities = q.getResultList();
        /* Extra code */

        return mktOrgs;
    }


    @Override
    public List<String> findDealerCode(String marketOrg, String region, String district) {
        //This should return something, not null.
        return null;
    }

所以,我不完全理解您的需求,但我的猜測是您不想提供findDealerCode()方法的實現,但仍想為getMarketStructure()添加一個實現以返回 Map。 如果是這樣,而不是為DealerDAO接口提供實現,如果您具有 java8 兼容性,為什么不在接口本身中使用默認方法實現。 這樣您仍然可以擴展 CRUD 存儲庫,使用默認的 spring 實現,並且仍然可以獲得您想要實現的目標。例如:

public interface DealerDAO extends CrudRepository<Obj,Obj> {
    /**
     * @return List of Marketing Orgs
     */
    default public Map<String, MarketOrg> getMarketStructure() {
        HashMap<String, MarketOrg> mktOrgs = new HashMap<String, MarketOrg>();

        /* Extra code */

        return mktOrgs;
    }

    @Query(
            value="SELECT DISTINCT ...",
            nativeQuery = true)
    List<String> findDealerCode(String marketOrg, String region, String district);
}

但這意味着該方法無法訪問實例的 state。 默認方法只能用於將調用委托給其他存儲庫方法 默認方法 - 根據定義 - 無法訪問實例的任何 state(因為接口沒有)。 它們只能委托給其他接口方法或調用其他類的 static。

或者在 spring-boot 方式中,如果您需要在getMarketStructure()方法中具有持久性上下文,則可以為這些方法提供單獨的接口。 喜歡:

@Repository
public interface DealerDAO extends CrudRepository<Obj,Obj>, DealerRepositoryCustom {
    @Query(
            value="SELECT DISTINCT ...",
            nativeQuery = true)
    List<String> findDealerCode(String marketOrg, String region, String district);
}

public interface DealerRepositoryCustom {
   public Map<String, MarketOrg> getMarketStructure();
}

那么您可以在 class 中實現DealerRepositoryCustom接口,例如:

@Repository
@Transactional(readOnly = true) // if you don't plan on modifying
public class DealerCustomRepositoryImpl implements DealerRepositoryCustom {
    @PersistenceContext
    private EntityManager em;

    @Override
    public List<String> findDealerCode(String marketOrg, String region, String district) {
        //This should return something, not null.
        return null;
    }
}

供參考閱讀

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM