hibernate - 在具有许多属性的 Spring Data JPA 中过滤结果的最佳解决方案是什么?

标签 hibernate jpa repository spring-data-jpa querydsl

我这里有一个产品表案例,它需要根据用户输入进行过滤,例如类别、颜色、尺寸、价格范围等等。

我正在使用 Spring Data JPA 并且对它从方法名称派生的查询感到满意,当我被迫使用 @query 选项来进行更复杂的查询,例如连接和...

但是对于我需要的Filter方法,恐怕我必须这样写

public interface ProductRepository extends JpaRepository<Product, Long> {
   //..... other methods

Page<Product> findByCategoriesContainingAndSalepriceBetween(List<Category> categories, Float minprice, Float maxprice, PageRequest pagerequest);

Page<Product> findByCategoriesContaining(List<Category> categories, PageRequest pagerequest);

Page<Product> findByCategoriesContainingAndSizeIn(List<Category> categories,Int[] sizes, PageRequest pagerequest);

Page<Product> findByCategoriesContainingAndSizeInAndSalepriceBetween(List<Category> categories,Float minprice, Float maxprice, PageRequest pagerequest);

}

似乎添加一些其他字段将迫使我编写这么多不同的组合

所以我查看了 QueryDsl 和 Specification,但它们似乎有很多额外代码,您能告诉我正确的路径吗??

最佳答案

我不同意 QueryDSL 会导致大量额外代码。这是我为 QueryDSL 准备的一些测试代码:

存储库定义:

public interface UserRepository extends PagingAndSortingRepository<User, Long>, QueryDslPredicateExecutor<User> {

    public User findOne(Predicate predicate);

    public List<User> findAll(Predicate predicate);
}

基于各种属性及其组合的测试代码:

 @Test
    public void testFindByEmailAddress() {
        User user = repository.findOne(QUser.user.emailAddress.eq("jack@hamilton.net"));
        Assert.assertNotNull(user);
        Assert.assertEquals("Jack", user.getForename());
        Assert.assertEquals("Hamilton", user.getSurname());
    }

    @Test
    public void testFindByGender() {
        List<User> users = repository.findAll(QUser.user.gender.eq(Gender.M));
        Assert.assertEquals(4, users.size());

        users = repository.findAll(QUser.user.gender.eq(Gender.F));
        Assert.assertEquals(2, users.size());
    }

    @Test
    public void testFindByCity() {

        List<User> users = repository.findAll(QUser.user.address.town.eq("Edinburgh"));
        Assert.assertEquals(2, users.size());

        users = repository.findAll(QUser.user.address.town.eq("Stirling"));
        Assert.assertEquals(1, users.size());
    }

    @Test
    public void testFindByGenderAndCity() {
        List<User> users = repository.findAll(QUser.user.address.town.eq("Glasgow").and(QUser.user.gender.eq(Gender.M)));
        Assert.assertEquals(2, users.size());

        users = repository.findAll(QUser.user.address.town.eq("Glasgow").and(QUser.user.gender.eq(Gender.F)));
        Assert.assertEquals(1, users.size());
    }

关于hibernate - 在具有许多属性的 Spring Data JPA 中过滤结果的最佳解决方案是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26449410/

相关文章:

hibernate - 生成sql脚本

java - JPAmappedBy不持久化具有关系的实体

repository - TYPO3/如何从现有表 fe_users 创建存储库?

spring - hibernate 存储库中的自定义方法

Hibernate:ManytoOne - 有多少个对象?

sql - 如何防止 Grails 在 dbCreate 期间生成默认的 Hibernate_sequence?

Spring Boot - 不是托管类型

java - Hibernate:在运行时生成动态 POJO 类和映射文件

hibernate - 如何在 JPA/Play 框架的 LIKE 子句中使用百分比?

asp.net-mvc-3 - ASP.NET MVC 3 使用 DI 和存储库与 EF 实现工作单元