如何在 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.