如何在 crud 存储库的实现中编写查询函数
How to code the query function in the implementation of a crud repository
所以通常,我只有一个实现 CrudRepository 并将我的 @Query 放在那里的接口。但是,为此我有一个 DAO class 是 repo 和一个实现该 repo 的 DAOImpl。因此,我实现了我只想使用查询的方法,并且 return 该查询作为字符串列表。我的问题是如何在实现中对部分进行编码以仅通过该字符串列表?
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()
的实现添加到 return一张地图。如果是这样,而不是为 DealerDAO
接口提供实现,如果你有 java8 兼容性,为什么不在接口本身中使用默认方法实现。这样你仍然可以扩展 CRUD 存储库,使用默认的 spring 实现并仍然得到你想要的 achieve.Like :
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);
}
但这意味着该方法无法访问实例的状态。默认方法只能用于委托对其他存储库方法的调用。默认方法 - 根据定义 - 不能访问实例的任何状态(因为接口有 none)。它们只能委托给其他接口方法或调用其他 classes.
的静态方法
或者在 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;
}
}
参考read.
所以通常,我只有一个实现 CrudRepository 并将我的 @Query 放在那里的接口。但是,为此我有一个 DAO class 是 repo 和一个实现该 repo 的 DAOImpl。因此,我实现了我只想使用查询的方法,并且 return 该查询作为字符串列表。我的问题是如何在实现中对部分进行编码以仅通过该字符串列表?
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()
的实现添加到 return一张地图。如果是这样,而不是为 DealerDAO
接口提供实现,如果你有 java8 兼容性,为什么不在接口本身中使用默认方法实现。这样你仍然可以扩展 CRUD 存储库,使用默认的 spring 实现并仍然得到你想要的 achieve.Like :
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);
}
但这意味着该方法无法访问实例的状态。默认方法只能用于委托对其他存储库方法的调用。默认方法 - 根据定义 - 不能访问实例的任何状态(因为接口有 none)。它们只能委托给其他接口方法或调用其他 classes.
的静态方法或者在 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;
}
}
参考read.