我这里有一个产品表案例,它需要根据用户输入进行过滤,例如类别、颜色、尺寸、价格范围等等。
我正在使用 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/