
kleinufo
Ich versuche, Spring-Data-JPA in mein Projekt zu integrieren. 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 findByOtherObj(OtherObj otherObj);
}
Ich muss nur zurück one (and only one)
Benutzer von otherObj, aber ich kann keine Möglichkeit finden, die maxResults zu kommentieren. Kann mir jemand einen Hinweis geben?
(mysql beschwert sich:
[email protected]: 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 zu sein? Warum ist eine so wichtige Funktion nicht in Spring-Data integriert?
Wenn ich diese Funktion manuell implementiere:
public class UserRepositoryImpl implements UserRepository
Ich muss unzählige vordefinierte 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

Oliver Drotbohm
Ab Spring Data JPA 1.7.0 (Evans Release Train).
Sie können die neu eingeführten verwenden Top
und First
Schlüsselwörter, mit denen Sie Abfragemethoden wie folgt definieren können:
findTop10ByLastnameOrderByFirstnameAsc(String lastname);
Spring Data begrenzt die Ergebnisse automatisch auf die von Ihnen definierte Zahl (standardmäßig 1, wenn weggelassen). Beachten Sie, dass die Reihenfolge der Ergebnisse hier relevant wird (entweder durch eine OrderBy
Klausel wie im Beispiel zu sehen oder durch Übergabe von a Sort
Parameter in die Methode). Lesen Sie mehr dazu im Blogbeitrag zum Thema neue Funktionen des Release Train von Spring Data Evans oder im Dokumentation.
Für frühere Versionen
Um nur Datensegmente abzurufen, verwendet Spring Data die Paginierungsabstraktion, die mit a geliefert wird Pageable
Schnittstelle auf der anfordernden Seite sowie a Page
Abstraktion auf der Ergebnisseite der Dinge. Damit könntest du anfangen
public interface UserRepository extends Repository<User, Long> {
List<User> findByUsername(String username, Pageable pageable);
}
und benutze es so:
Pageable topTen = new PageRequest(0, 10);
List<User> result = repository.findByUsername("Matthews", topTen);
Wenn Sie den Kontext des Ergebnisses wissen müssen (um welche Seite handelt es sich eigentlich? Ist es die erste? Wie viele sind es insgesamt?), verwenden Sie Page
als Rückgabetyp:
public interface UserRepository extends Repository<User, Long> {
Page<User> findByUsername(String username, Pageable pageable);
}
Der Client-Code kann dann so etwas tun:
Pageable topTen = new PageRequest(0, 10);
Page<User> result = repository.findByUsername("Matthews", topTen);
Assert.assertThat(result.isFirstPage(), is(true));
Nicht, dass wir eine Zählprojektion der tatsächlich auszuführenden Abfrage auslösen, falls Sie verwenden Page
als Rückgabetyp, da wir herausfinden müssen, wie viele Elemente es insgesamt gibt, um die Metadaten zu berechnen. Stellen Sie darüber hinaus sicher, dass Sie die tatsächlich ausrüsten PageRequest
mit Sortierinformationen, um stabile Ergebnisse zu erhalten. Andernfalls könnten Sie die Abfrage zweimal auslösen und unterschiedliche Ergebnisse erhalten, auch ohne dass sich die Daten darunter geändert haben.
Wenn Sie Java 8 und Spring Data 1.7.0 verwenden, können Sie Standardmethoden verwenden, wenn Sie a kombinieren möchten @Query
Anmerkung mit Einstellung der maximalen Ergebnisse:
public interface UserRepository extends PagingAndSortingRepository<User,Long> {
@Query("from User u where ...")
List<User> findAllUsersWhereFoo(@Param("foo") Foo foo, Pageable pageable);
default List<User> findTop10UsersWhereFoo(Foo foo) {
return findAllUsersWhereFoo(foo, new PageRequest(0,10));
}
}
Es gibt eine Möglichkeit, das Äquivalent von “a setMaxResults(n) by annotation” wie im Folgenden bereitzustellen:
public interface ISomething extends JpaRepository<XYZ, Long>
{
@Query("FROM XYZ a WHERE a.eventDateTime < :before ORDER BY a.eventDateTime DESC")
List<XYZ> findXYZRecords(@Param("before") Date before, Pageable pageable);
}
Dies sollte funktionieren, wenn ein Pageable als Parameter gesendet wird. Um beispielsweise die ersten 10 Datensätze abzurufen, müssen Sie pageable auf diesen Wert setzen:
new PageRequest(0, 10)

Aserafati
die neue Version von Spring Data JPA mit einer anderen Liste von Modulen zusammen genannt Evans hat die Funktion, Schlüsselwörter zu verwenden Top20
und First
um das Abfrageergebnis einzuschränken,
so könntest du jetzt schreiben
List<User> findTop20ByLastname(String lastname, Sort sort);
oder
List<User> findTop20ByLastnameOrderByIdDesc(String lastname);
oder für ein einzelnes Ergebnis
List<User> findFirstByLastnameOrderByIdDesc(String lastname);
Die beste Wahl für mich ist die native Abfrage:
@Query(value="SELECT * FROM users WHERE other_obj = ?1 LIMIT 1", nativeQuery = true)
User findByOhterObj(OtherObj otherObj);

Abbas Hosseini
new PageRequest(0,10)
funktioniert nicht in neueren Spring-Versionen (ich verwende 2.2.1.RELEASE
). Grundsätzlich hat der Konstruktor einen zusätzlichen Parameter als erhalten Sort
Typ. Außerdem ist der Konstruktor protected
Sie müssen also entweder eine ihrer untergeordneten Klassen verwenden oder sie aufrufen of
statische Methode:
PageRequest.of(0, 10, Sort.sort(User.class).by(User::getFirstName).ascending()))
Sie können auch auf die Verwendung von verzichten Sort
Parameter und verwenden Sie implizit die Standardsortierung (sortieren nach pk usw.):
PageRequest.of(0, 10)
Ihre Funktionsdeklaration sollte in etwa so aussehen:
List<User> findByUsername(String username, Pageable pageable)
und die Funktion wird sein:
userRepository.findByUsername("Abbas", PageRequest.of(0,10, Sort.sort(User.class).by(User::getLastName).ascending());

Krake
Es ist auch möglich, @QueryHints zu verwenden. Das folgende Beispiel verwendet org.eclipse.persistence.config.QueryHints#JDBC_MAX_ROWS
@Query("SELECT u FROM User u WHERE .....")
@QueryHints(@QueryHint(name = JDBC_MAX_ROWS, value = "1"))
Voter findUser();
.
7847000cookie-checksetMaxResults für Spring-Data-JPA-Annotation?yes