Is there a way to override the findAll query executed by Spring Data Rest?
I need a way of filtering the results based on some specific criteria and it seems that using a @NamedQuery
should be along the lines of what I'm looking for so I setup a test.
@Entity
@Table(name = "users")
@NamedQueries({
@NamedQuery(name = "User.findAll", query="SELECT u FROM User u WHERE u.username = 'test'"),
@NamedQuery(name = "User.findNameEqualsTest", query="SELECT u FROM User u WHERE u.username = 'test'")
})
public class User implements Serializable, Identifiable<Long> { }
With this in place I would expect SDR to utilize my findAll() query (returning 1 result) but instead it executes the same old findAll logic (returning all results).
In my Repository I added:
@Repository
@RestResource(path = "users", rel = "users")
public interface UserJpaRepository extends JpaRepository<User, Long> {
public Page<User> findNameEqualsTest(Pageable pageable);
}
and in this case it DOES pick up the provided @NamedQuery
. So...
How should I go about overriding the default findAll()
logic? I need to actually construct a complex set of criteria and apply it to the result set.
Yes, you can create your Implementation of your Repository interface, there is acouple section in
http://docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/html/repositories.html#repositories.custom-implementations
Repository
Custom Interface
Custom implementation
Instead of override save make it with findAll, then you can create complex customization
In the upcoming version 1.5 (an RC is available in our milestone repositories) of Spring Data JPA you can simply redeclare the method in your repository interface and annotate it with
@Query
so that the execution as query method is triggered. This will then cause the named query to be looked up just as you're already used to from query methods:A few notes on your repository declaration:
@Repository
. That annotation doesn't have any effect at all here.@RestResource
annotation configures the exporter in a way that will be the default anyway in Spring Data REST 2.0 (also in RC already). Ging forward, prefer@RestRepositoryResource
, but as I said: the pluralization will be the default anyway.CrudRepository
orPagingAndSortingRepository
.