Estoy tratando de incorporar Spring-Data-JPA en mi proyecto. Una cosa que me confunde es cómo puedo lograr setMaxResults (n) por anotación.
por ejemplo, mi código:
public interface UserRepository extends CrudRepository<User , Long>
{
@Query(value="From User u where u.otherObj = ?1 ")
public User findByOhterObj(OtherObj otherObj);
}
Solo necesito devolver one (and only one)
User de otherObj, pero no puedo encontrar una manera de anotar maxResults. ¿Alguien puede darme una pista?
(mysql se queja:
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
)
Encontré un enlace: https://jira.springsource.org/browse/DATAJPA-147 , lo intenté pero fallé. Parece que no es posible ahora? ¿Por qué una característica tan importante no está integrada en Spring-Data?
Si implemento esta función manualmente:
public class UserRepositoryImpl implements UserRepository
Tengo que implementar toneladas de métodos predefinidos CrudRepository
, esto sería terrible.
entornos: spring-3.1, spring-data-jpa-1.0.3.RELEASE.jar, spring-data-commons-core-1.1.0.RELEASE.jar
fuente
List
como el tipo de retorno del método.Top
y lasFirst
palabras clave no son aplicables a los métodos que usan@Query
anotaciones? ¿Solo aquellos que utilizan la generación de consultas basada en el nombre del método?Si está utilizando Java 8 y Spring Data 1.7.0, puede usar métodos predeterminados si desea combinar una
@Query
anotación con la configuración de resultados máximos:fuente
Stream<User> ... {...} default Optional<User> ... { ...findAny() }
Hay una forma en que puede proporcionar el equivalente de "un setMaxResults (n) por anotación" como en el siguiente:
Esto debería hacer el truco, cuando se envía un pageable como parámetro. Por ejemplo, para obtener los primeros 10 registros, debe establecer que se pueda paginar a este valor:
fuente
List
funciona perfectamente (y evita unacount
consulta innecesaria como ya se mencionó en un comentario anterior )Utilice Spring Data Evans (LIBERACIÓN 1.7.0)
La nueva versión de Spring Data JPA con otra lista de módulos juntos llamada Evans tiene la característica de usar palabras clave
Top20
yFirst
limitar el resultado de la consulta,para que ahora puedas escribir
o
o por un solo resultado
fuente
Pageable
objeto. echa un vistazo a la documentación de primaveraLa mejor opción para mí es la consulta nativa:
fuente
nativeQuery
parámetro de anotación JPA agregado no para ignorar.Si su clase se
@Repository
extiendeJpaRepository
, puede usar el siguiente ejemplo.getContent return a
List<Transaction>
.fuente
También es posible usar @QueryHints. El siguiente ejemplo usa org.eclipse.persistence.config.QueryHints # JDBC_MAX_ROWS
fuente
@QueryHints({@QueryHint(name = org.hibernate.annotations.FETCH_SIZE, value = "1")})
Hibernate, pero el alias :( no funcionanew PageRequest(0,10)
no funciona en las nuevas versiones de Spring (estoy usando2.2.1.RELEASE
). Básicamente, el constructor obtuvo un parámetro adicional comoSort
tipo. Además, el constructor esprotected
así que debe usar una de sus clases secundarias o llamar a suof
método estático:También puede omitir el uso del
Sort
parámetro y usar implícitamente el orden predeterminado (ordenar por pk, etc.):Su declaración de función debería ser algo como esto:
y la función será:
fuente