Spring JPA自定义存储库有几个标准

时间:2018-02-28 16:04:16

标签: java spring spring-boot

我正在引用this link关于创建自定义存储库。我正在创建一个Spring Boot应用程序,该应用程序当前具有自定义存储库接口,如下所示。

public interface CustomMyDomainRepository {
    Page<MyDomain> findBySearchCriteria(SearchFields searchFields, Pageable pageable);
}

目前,其实施如下。

@Repository
public class CustomMyDomainRepositoryImpl implements CustomMyDomainRepository {

    @PersistenceContext
    EntityManager entityManager;

    public Page<MyDomain> findBySearchCriteria(SearchFields searchFields, Pageable pageable) {
        Query query = getQuery(searchFields, pageable);
        List<MyDomain> myDomains = query.getResultList();
        return new PageImpl<>(myDomains, pageable, myDomains.size());
    }

    private Query getQuery(SearchFields searchFields, Pageable pageable) {
        StringBuilder stringBuilder = new StringBuilder();
        Map<String, Object> map = new HashMap<>();
        stringBuilder.append("SELECT md.* FROM my_domain as md WHERE ");

        if (Objects.nonNull(searchFields.getStatus()) && !searchFields.getStatus().isEmpty()) {
            stringBuilder.append("md.status = :status AND ");
            map.put("status", searchFields.getStatus());
        } //... And many more search fields

        // Confused how to use Pageable for sorting
        // stringBuilder.append("ORDER BY :sortColumn :sortType");

        Query query = entityManager.createQuery(stringBuilder.toString());

        for (String param : map.keySet()) {
            query.setParameter(param, map.get(param));
        }

        return query;
    }
}

此代码中有多个问题。

首要问题是,我很困惑如何使用Pageable为此搜索查询设置分页。

第二个问题是目前SearchFields只有2个属性。但它可以达到20个搜索字段。有没有更好的方法来查询所有这些字段,而不是像我上面那样有条件地更新查询字符串?

1 个答案:

答案 0 :(得分:1)

从长远来看,将查询构建为String将非常麻烦。看看可以使用流畅的API构建自定义查询的替代方法,如:

最后,您仍然需要有条件地构建查询或示例,但它不会比连接字符串更简单,更不容易出错且更安全。