it-swarm.com.de

setMaxResults für Spring-Data-JPA-Annotation?

Ich versuche, Spring-Data-JPA in mein Projekt einzubinden. 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, aber ich kann keine Möglichkeit finden, die maxResults mit Anmerkungen zu versehen. Kann mir jemand einen Tipp 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, aber es ist fehlgeschlagen. Es scheint jetzt nicht möglich? Warum ist ein so wichtiges Feature nicht in Spring-Data integriert?

Wenn ich diese Funktion manuell implementiere:

public class UserRepositoryImpl implements UserRepository

Ich muss Tonnen vordefinierter Methoden in CrudRepository implementieren, 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

105
smallufo

Ab Spring Data JPA 1.7.0 (Evans Release Train).

Sie können die neu eingeführten Schlüsselwörter Top und First verwenden, mit denen Sie die folgenden Abfragemethoden definieren können:

findTop10ByLastnameOrderByFirstnameAsc(String lastname);

Spring Data begrenzt die Ergebnisse automatisch auf die von Ihnen festgelegte Anzahl (standardmäßig 1, wenn nichts angegeben ist). Beachten Sie, dass die Reihenfolge der Ergebnisse hier relevant wird (entweder durch eine OrderBy -Klausel, wie im Beispiel gezeigt, oder durch Übergabe eines Sort -Parameters an die Methode). Lesen Sie mehr dazu im Blog-Beitrag über neue Funktionen des Release-Zugs von Spring Data Evans oder in der Dokumentation .

Für frühere Versionen

Um nur Datenabschnitte abzurufen, verwendet Spring Data die Paginierungsabstraktion, die auf der anfordernden Seite eine Pageable -Schnittstelle sowie auf der Ergebnisseite eine Page -Abstraktion enthält. Also könnte man anfangen mit

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 kennen müssen (welche Seite ist es tatsächlich? Ist es die erste? Wie viele gibt 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 Page als Rückgabetyp verwenden, da wir herausfinden müssen, wie viele Elemente insgesamt zur Berechnung der Metadaten vorhanden sind. Stellen Sie darüber hinaus sicher, dass Sie PageRequest tatsächlich mit Sortierinformationen versehen, um stabile Ergebnisse zu erzielen. Andernfalls können Sie die Abfrage zweimal auslösen und unterschiedliche Ergebnisse erhalten, auch wenn sich die Daten darunter nicht geändert haben.

166
Oliver Drotbohm

Wenn Sie Java 8 und Spring Data 1.7.0 verwenden, können Sie Standardmethoden verwenden, wenn Sie eine Annotation @Query Mit dem Festlegen maximaler Ergebnisse kombinieren möchten:

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));
  }

}
94
Wim Deblauwe

Es gibt eine Möglichkeit, das Äquivalent von "setMaxResults (n) by annotation" wie folgt anzugeben:

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 der Trick sein, wenn ein Pageable als Parameter gesendet wird. Um zum Beispiel die ersten 10 Datensätze abzurufen, müssen Sie pageable auf diesen Wert setzen:

new PageRequest(0, 10)
27
ncaralicea

Verwenden Sie Spring Data Evans (1.7.0 RELEASE)

die neue Version von Spring Data JPA mit einer weiteren Liste von Modulen mit dem Namen Evans enthält die Funktion der Verwendung von Schlüsselwörtern Top20 und First, um das Abfrageergebnis zu begrenzen,

so konnte man 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);
21
azerafati

Beste Wahl für mich ist native Abfrage:

@Query(value="SELECT * FROM users WHERE other_obj = ?1 LIMIT 1", nativeQuery = true)
User findByOhterObj(OtherObj otherObj);
12
GKislin

Wenn deine Klasse @Repository erweitert JpaRepository Sie können das folgende Beispiel verwenden.

int limited = 100;
Pageable pageable = new PageRequest(0,limited);
Page<Transaction> transactionsPage = transactionRepository.findAll(specification, pageable);
return transactionsPage.getContent();

getContent return a List<Transaction>.

4
Luis Camargo

Es ist auch mit @QueryHints möglich. Im folgenden Beispiel wird org.Eclipse.persistence.config.QueryHints # JDBC_MAX_ROWS verwendet

@Query("SELECT u FROM User u WHERE .....")
@QueryHints(@QueryHint(name = JDBC_MAX_ROWS, value = "1"))
Voter findUser();
4
kraken