[英]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.