Java 如何在crud存储库的实现中对查询函数进行编码

Java 如何在crud存储库的实现中对查询函数进行编码,java,crud,Java,Crud,所以通常,我只有一个接口来实现crudepository并将@Query放在其中。然而,对于这一点,我有一个作为repo的DAO类和一个实现该repo的DAOImpl。因此,我实现了我只想使用查询并将该查询作为字符串列表返回的方法。我的问题是如何对实现中的部分进行编码,以便只传递字符串列表 public interface DealerDAO { /** * @return List of Marketing Orgs */ public Map<Str

所以通常,我只有一个接口来实现crudepository并将@Query放在其中。然而,对于这一点,我有一个作为repo的DAO类和一个实现该repo的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);
}

因此,我不完全理解您的需求,但我猜您不想为FindDelercode方法提供实现,但仍然希望为getMarketStructure添加一个实现以返回映射。如果是这样,与其为DealerDAO接口提供一个实现,不如在接口本身中使用一个默认的方法实现。通过这种方式,您仍然可以扩展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);
}
然后,您可以在类中实现DealErrorRepositoryCustom接口,如:

@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;
    }
}

作为参考。

我想我在发布getMarketStructure方法时删掉了太多的代码。默认设置几乎可以工作,但是如果我把它放在DAO中,我不能带上我的持久性注释,也不能像在getMarketStructure中那样使用nativeQuery。在我的原始帖子中更新了代码,但是是的,我想为getMarketStructure函数提供实现,但是如果我不需要为FindDelercode函数提供实现,我不想这样做。我只需要查询中的字符串列表。如果您需要在此方法中使用实体管理器,我建议您仅为此特定方法使用一个单独的接口并实现它,这样您就可以在另一个接口中使用默认crud实现。@DevinM我刚刚用另一种方法更新了答案,检查它是否适合你的情况或者你想要达到的目标。嗯,这实际上是一个非常干净的方法。非常感谢。
@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();
}
@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;
    }
}