Estou tentando incorporar o Spring-Data-JPA no meu projeto. Uma coisa que me confunde é como obter setMaxResults (n) por anotação?
por exemplo, meu código:
public interface UserRepository extends CrudRepository<User , Long>
{
@Query(value="From User u where u.otherObj = ?1 ")
public User findByOhterObj(OtherObj otherObj);
}
Eu só preciso retornar one (and only one)
User de otherObj, mas não consigo encontrar uma maneira de anotar os maxResults. Alguém pode me dar uma dica?
(o mysql reclama:
com.mysql.jdbc.JDBC4PreparedStatement@5add5415: select user0_.id as id100_, user0_.created as created100_ from User user0_ where user0_.id=2 limit ** NOT SPECIFIED **
WARN util.JDBCExceptionReporter - SQL Error: 0, SQLState: 07001
ERROR util.JDBCExceptionReporter - No value specified for parameter 2
)
Encontrei um link: https://jira.springsource.org/browse/DATAJPA-147 , tentei, mas falhei. Parece que não é possível agora? Por que um recurso tão importante não é incorporado ao Spring-Data?
Se eu implementar esse recurso manualmente:
public class UserRepositoryImpl implements UserRepository
Eu tenho que implementar toneladas de métodos predefinidos CrudRepository
, isso seria terrível.
ambientes: spring-3.1, spring-data-jpa-1.0.3.RELEASE.jar, spring-data-commons-core-1.1.0.RELEASE.jar
fonte
List
como o tipo de retorno do método.Top
e asFirst
palavras - chave não são aplicáveis aos métodos que usam@Query
anotações? Somente aqueles que usam geração de consulta baseada em nome do método?Se você estiver usando o Java 8 e o Spring Data 1.7.0, poderá usar métodos padrão se desejar combinar uma
@Query
anotação com a definição de resultados máximos:fonte
Stream<User> ... {...} default Optional<User> ... { ...findAny() }
Existe uma maneira de fornecer o equivalente a "um setMaxResults (n) por anotação", como no seguinte:
Isso deve funcionar, quando um paginável é enviado como parâmetro. Por exemplo, para buscar os 10 primeiros registros, você precisa definir paginável para este valor:
fonte
List
funciona perfeitamente (e evita uma desnecessáriacount
consulta como já mencionado em um comentário anterior )Use o Spring Data Evans (1.7.0 RELEASE)
a nova versão do Spring Data JPA com outra lista de módulos chamada Evans possui o recurso de usar palavras
Top20
- chave eFirst
limitar o resultado da consulta,agora você pode escrever
ou
ou para um único resultado
fonte
Pageable
objeto. confira a documentação primaveraA melhor opção para mim é a consulta nativa:
fonte
nativeQuery
parâmetro de anotação JPA adicionado, não para ignorar.Se sua turma
@Repository
se estender,JpaRepository
você pode usar o exemplo abaixo.retorno getContent a
List<Transaction>
.fonte
Também é possível usar o @QueryHints. O exemplo a seguir usa org.eclipse.persistence.config.QueryHints # JDBC_MAX_ROWS
fonte
@QueryHints({@QueryHint(name = org.hibernate.annotations.FETCH_SIZE, value = "1")})
no Hibernate, mas apelido :( não funcionanew PageRequest(0,10)
não funciona nas versões mais recentes do Spring (estou usando2.2.1.RELEASE
). Basicamente, o construtor obteve um parâmetro adicional comoSort
tipo. Além disso, o construtor éprotected
para que você precise usar uma de suas classes filho ou chamar seuof
método estático:Você também pode omitir o uso do
Sort
parâmetro e usar implicitamente a classificação padrão (classificar por pk, etc.):Sua declaração de função deve ser algo como isto:
e a função será:
fonte