5

I use Spring Boot 1.4.1 AND spring-boot-starter-data-jpa

When query my custom method like 'findByName(String name)' it's not cache.

But when query default method like 'findOne(Interger id)' it's work.

application.properties:

spring.jpa.properties.hibernate.cache.use_query_cache=true

Repository:

@Repository
public interface AuthorRepository extends CrudRepository<Author, Integer> {
    Author findByName(String name);
}

Tests:

public class RepositoryTests {
    @Autowired
    private AuthorRepository authorRepository;

    @Test
    @Transactional
    public void test() {
        authorRepository.save(new Author("admin"));

        // ***Not work. query **5** times.
        Author author = authorRepository.findByName("admin");
        author = authorRepository.findByName("admin");
        author = authorRepository.findByName("admin");
        author = authorRepository.findByName("admin");
        author = authorRepository.findByName("admin");

        // ***It's work. query **1** times.
        Author author = authorRepository.findOne(1);
        author = authorRepository.findOne(1);
        author = authorRepository.findOne(1);
        author = authorRepository.findOne(1);
        author = authorRepository.findOne(1);
    }
}
Cœur
  • 37,241
  • 25
  • 195
  • 267
Alex
  • 368
  • 1
  • 5
  • 12

1 Answers1

9
@Repository
public interface AuthorRepository extends CrudRepository<Author, Integer> {
    @QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value ="true") })
    Author findByName(String name);
}

Should do the trick. (Note: the @Repository is not needed because you already extend CrudRepository)

Y.M.
  • 640
  • 1
  • 7
  • 17