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