当前位置: 首页 > 面试题库 >

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

尹庆
2023-03-14
问题内容

我这里有一个产品表的案例,需要通过用户输入(例如类别,颜色,大小,价格范围等)进行过滤。

我正在使用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());
    }


 类似资料:
  • 问题内容: 至少有六打Django应用程序为Django提供OpenID身份验证: django-openid django-openid-auth 另一个django-openid-auth,似乎已经死了 django-authopenid django-socialauth(还提供对Twitter和Facebook帐户的身份验证) django-socialregistration(也具有Fa

  • 问题内容: 请注意 :这是一个古老的问题,带有古老的答案。现在大多数链接的应用程序都不再需要维护。这些天来,大多数人似乎都使用django- allauth 或python-social- auth 。为了后代的缘故,下面将完整保留原始问题。 至少有六打Django应用程序为Django提供OpenID身份验证: django-openid django-openid-auth 另一个django

  • 问题内容: 我已经开发了一些类似于DAO的自定义类,以满足我的项目的一些非常特殊的要求,这是一个不在任何框架内运行的服务器端进程。 该解决方案非常有效,除了每次发出新请求时,我都会通过MySQLdb.connect打开一个新连接。 将其切换为在python中使用连接池的最佳“插入”解决方案是什么?我在想像Java的通用DBCP解决方案。 该过程运行很长时间,并且有许多线程需要发出请求,但不是所有线

  • 问题内容: 我想过滤java.util.Collection基于谓词的。 问题答案: Java 8(2014)在一行代码中使用流和lambda解决了此问题: 这是一个教程。 使用修改收集到位。(注意:在这种情况下,谓词将删除满足该谓词的对象): 允许过滤集合而无需编写循环或内部类: 你能想象一些更具可读性的东西吗?

  • 我使用Windows窗体已经有一段时间了,由于窗体的某些限制,我想用更好的方法来制作GUI。我找到了WPF,它看起来很有前途,但我想问你们,有没有更好的方法用C#为Windows制作好的GUI?提前道谢!