Dynamic Queries in Spring Data JPA

前端 未结 3 994
忘了有多久
忘了有多久 2020-12-09 10:39

I am looking for a solution to dynamically build queries using Spring Data JPA. I have a GameController which has a RESTful service endpoint /games which takes 4 optional pa

3条回答
  •  半阙折子戏
    2020-12-09 11:01

    I would say that using QueryDSL is one way of doing what you want.

    For example I have a repository defined as below:

    public interface UserRepository extends PagingAndSortingRepository, QueryDslPredicateExecutor {
    
        public Page findAll(Predicate predicate, Pageable p);
    }
    

    I can call this method with any combination of parameters, like below:

    public class UserRepositoryTest{
    
        @Autowired
        private UserRepository userRepository;
    
        @Test
        public void testFindByGender() {
            List users = userRepository.findAll(QUser.user.gender.eq(Gender.M));
            Assert.assertEquals(4, users.size());
    
            users = userRepository.findAll(QUser.user.gender.eq(Gender.F));
            Assert.assertEquals(2, users.size());
        }
    
        @Test
        public void testFindByCity() {
    
            List users = userRepository.findAll(QUser.user.address.town.eq("Edinburgh"));
            Assert.assertEquals(2, users.size());
    
            users = userRepository.findAll(QUser.user.address.town.eq("Stirling"));
            Assert.assertEquals(1, users.size());
        }
    
        @Test
        public void testFindByGenderAndCity() {
            List users = userRepository.findAll(QUser.user.address.town.eq("Glasgow").and(QUser.user.gender.eq(Gender.M)));
            Assert.assertEquals(2, users.size());
    
            users = userRepository.findAll(QUser.user.address.town.eq("Glasgow").and(QUser.user.gender.eq(Gender.F)));
            Assert.assertEquals(1, users.size());
        }
    }
    

提交回复
热议问题