Ich versuche, Spring-Data-JPA in mein Projekt einzubeziehen. Eine Sache, die mich verwirrt, ist, wie ich setMaxResults (n) durch Annotation erreiche.
Zum Beispiel mein Code:
public interface UserRepository extends CrudRepository<User , Long>
{
@Query(value="From User u where u.otherObj = ?1 ")
public User findByOhterObj(OtherObj otherObj);
}
Ich muss nur one (and only one)
User von otherObj zurückgeben, kann aber keine Möglichkeit finden, die maxResults mit Anmerkungen zu versehen. Kann mir jemand einen Hinweis geben?
(MySQL beschwert sich:
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
)
Ich habe einen Link gefunden: https://jira.springsource.org/browse/DATAJPA-147 . Ich habe es versucht, bin aber gescheitert. Es scheint jetzt nicht möglich? Warum ist eine so wichtige Funktion nicht in Spring-Data integriert?
Wenn ich diese Funktion manuell implementiere:
public class UserRepositoryImpl implements UserRepository
Ich muss Tonnen von vordefinierten Methoden implementieren CrudRepository
, das wäre schrecklich.
Umgebungen: spring-3.1, spring-data-jpa-1.0.3.RELEASE.jar, spring-data-commons-core-1.1.0.RELEASE.jar
quelle
List
den Rückgabetyp der Methode verwenden.Top
undFirst
Schlüsselwörter sind nicht auf Methoden anwendbar, die@Query
Anmerkungen verwenden? Nur diejenigen, die eine auf Methodennamen basierende Abfragegenerierung verwenden?Wenn Sie Java 8 und Spring Data 1.7.0 verwenden, können Sie Standardmethoden verwenden, wenn Sie eine
@Query
Anmerkung mit dem Festlegen maximaler Ergebnisse kombinieren möchten :quelle
Stream<User> ... {...} default Optional<User> ... { ...findAny() }
Es gibt eine Möglichkeit, das Äquivalent von "a setMaxResults (n) durch Annotation" wie folgt bereitzustellen:
Dies sollte den Trick tun, wenn ein Pageable als Parameter gesendet wird. Um beispielsweise die ersten 10 Datensätze abzurufen, müssen Sie pageable auf diesen Wert setzen:
quelle
List
funktioniert perfekt (und vermeidet eine unnötigecount
Abfrage, wie bereits in einem vorherigen Kommentar erwähnt )Verwenden Sie Spring Data Evans (1.7.0 RELEASE)
Die neue Version von Spring Data JPA mit einer weiteren Liste von Modulen namens Evans bietet die Funktion, Schlüsselwörter
Top20
und zu verwendenFirst
das Abfrageergebnis einzuschränken.so könntest du jetzt schreiben
oder
oder für ein einzelnes Ergebnis
quelle
Pageable
Objekt übergeben.Die beste Wahl für mich ist die native Abfrage:
quelle
nativeQuery
Annotationsparameter hinzugefügt, der nicht ignoriert werden soll.Wenn Ihre Klasse
@Repository
erweitert wirdJpaRepository
, können Sie das folgende Beispiel verwenden.getContent return a
List<Transaction>
.quelle
Es ist auch möglich, @QueryHints zu verwenden. Das folgende Beispiel verwendet org.eclipse.persistence.config.QueryHints # JDBC_MAX_ROWS
quelle
@QueryHints({@QueryHint(name = org.hibernate.annotations.FETCH_SIZE, value = "1")})
in Hibernate, aber Alias :( funktioniert nichtnew PageRequest(0,10)
funktioniert nicht in neueren Spring-Versionen (ich benutze2.2.1.RELEASE
). Grundsätzlich hat der Konstruktor einen zusätzlichen Parameter alsSort
Typ erhalten. Darüber hinaus müssen Sie für den Konstruktorprotected
entweder eine seiner untergeordneten Klassen verwenden oder seineof
statische Methode aufrufen :Sie können auch die Verwendung von
Sort
Parametern weglassen und implizit die Standardsortierung (Sortierung nach pk usw.) verwenden:Ihre Funktionsdeklaration sollte ungefähr so aussehen:
und die Funktion wird sein:
quelle