J'essaye d'intégrer Spring-Data-JPA dans mon projet. Une chose qui me trouble est de savoir comment obtenir setMaxResults (n) par annotation?
par exemple, mon code:
public interface UserRepository extends CrudRepository<User , Long>
{
@Query(value="From User u where u.otherObj = ?1 ")
public User findByOhterObj(OtherObj otherObj);
}
Je n'ai besoin que de renvoyer one (and only one)
User depuis otherObj, mais je ne trouve pas de moyen d'annoter les maxResults. Quelqu'un peut-il me donner un indice?
(mysql se plaint:
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
)
J'ai trouvé un lien: https://jira.springsource.org/browse/DATAJPA-147 , j'ai essayé mais j'ai échoué. Cela ne semble pas possible maintenant? Pourquoi une fonctionnalité aussi importante n'est-elle pas intégrée à Spring-Data?
Si j'implémente cette fonctionnalité manuellement:
public class UserRepositoryImpl implements UserRepository
Je dois implémenter des tonnes de méthodes prédéfinies dans CrudRepository
, ce serait terrible.
environnements: spring-3.1, spring-data-jpa-1.0.3.RELEASE.jar, spring-data-commons-core-1.1.0.RELEASE.jar
la source
List
comme type de retour de la méthode.Top
et lesFirst
mots-clés ne sont pas applicables aux méthodes qui utilisent l'@Query
annotation? Seuls ceux qui utilisent la génération de requêtes basée sur le nom de la méthode?Si vous utilisez Java 8 et Spring Data 1.7.0, vous pouvez utiliser les méthodes par défaut si vous souhaitez combiner une
@Query
annotation avec la définition de résultats maximum:la source
Stream<User> ... {...} default Optional<User> ... { ...findAny() }
Il existe un moyen de fournir l'équivalent de "un setMaxResults (n) par annotation" comme dans l'exemple suivant:
Cela devrait faire l'affaire, lorsqu'un pageable est envoyé comme paramètre. Par exemple, pour récupérer les 10 premiers enregistrements, vous devez définir paginable sur cette valeur:
la source
List
fonctionne parfaitement (et évite unecount
requête inutile comme déjà mentionné dans un commentaire précédent )Utiliser Spring Data Evans (1.7.0 RELEASE)
la nouvelle version de Spring Data JPA avec une autre liste de modules ensemble appelée Evans a la particularité d'utiliser des mots
Top20
- clés etFirst
de limiter le résultat de la requête,pour que tu puisses maintenant écrire
ou
ou pour un seul résultat
la source
Pageable
objet. consultez la documentation du printempsLe meilleur choix pour moi est la requête native:
la source
nativeQuery
paramètre d'annotation JPA ajouté non pour ignorer.Si votre classe
@Repository
s'étend,JpaRepository
vous pouvez utiliser l'exemple ci-dessous.getContent renvoie un fichier
List<Transaction>
.la source
C'est également possible en utilisant @QueryHints. L'exemple ci-dessous utilise org.eclipse.persistence.config.QueryHints # JDBC_MAX_ROWS
la source
@QueryHints({@QueryHint(name = org.hibernate.annotations.FETCH_SIZE, value = "1")})
dans Hibernate, mais alias: (ne fonctionne pasnew PageRequest(0,10)
ne fonctionne pas dans les versions plus récentes de Spring (j'utilise2.2.1.RELEASE
). Fondamentalement, le constructeur a un paramètre supplémentaire commeSort
type. De plus, le constructeur estprotected
donc obligé d'utiliser l'une de ses classes enfants ou d'appeler saof
méthode statique:Vous pouvez également omettre l'utilisation du
Sort
paramètre et utiliser implicitement le tri par défaut (tri par pk, etc.):Votre déclaration de fonction devrait ressembler à ceci:
et la fonction sera:
la source