Saya mencoba untuk memasukkan Spring-Data-JPA ke dalam proyek saya. Satu hal yang membingungkan saya adalah bagaimana cara mencapai setMaxResults (n) dengan anotasi?
misalnya, kode saya:
public interface UserRepository extends CrudRepository<User , Long>
{
@Query(value="From User u where u.otherObj = ?1 ")
public User findByOhterObj(OtherObj otherObj);
}
Saya hanya perlu mengembalikan one (and only one)
Pengguna dari otherObj, tetapi saya tidak dapat menemukan cara untuk menganotasi maxResults. Bisakah seseorang memberi saya petunjuk?
(mysql mengeluh:
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
)
Saya menemukan tautan: https://jira.springsource.org/browse/DATAJPA-147 , saya mencoba tetapi gagal. Sepertinya tidak mungkin sekarang? Mengapa fitur sepenting itu tidak disertakan dalam Spring-Data?
Jika saya menerapkan fitur ini secara manual:
public class UserRepositoryImpl implements UserRepository
Saya harus menerapkan banyak metode yang telah ditentukan sebelumnya CrudRepository
, ini akan mengerikan.
lingkungan: spring-3.1, spring-data-jpa-1.0.3.RELEASE.jar, spring-data-commons-core-1.1.0.RELEASE.jar
sumber
List
sebagai tipe kembalian dari metode tersebut.Top
danFirst
kata kunci tidak berlaku untuk metode yang menggunakan@Query
anotasi? Hanya mereka, yang menggunakan pembuatan kueri berbasis nama metode?Jika Anda menggunakan Java 8 dan Spring Data 1.7.0, Anda dapat menggunakan metode default jika Anda ingin menggabungkan
@Query
anotasi dengan pengaturan hasil yang maksimal:sumber
Stream<User> ... {...} default Optional<User> ... { ...findAny() }
Ada cara untuk memberikan padanan dengan "setMaxResults (n) by annotation" seperti berikut:
Ini akan berhasil, ketika sebuah halaman dikirim sebagai parameter. Misalnya untuk mengambil 10 record pertama Anda perlu mengatur pageable ke nilai ini:
sumber
List
bekerja dengan sempurna (dan menghindaricount
pertanyaan yang tidak perlu seperti yang telah disebutkan dalam komentar sebelumnya )Gunakan Spring Data Evans (RELEASE 1.7.0)
rilis baru Spring Data JPA dengan daftar modul lain yang disebut Evans memiliki fitur menggunakan kata kunci
Top20
danFirst
untuk membatasi hasil kueri,jadi sekarang Anda bisa menulis
atau
atau untuk satu hasil
sumber
Pageable
objek. lihat dokumentasi musim semiPilihan terbaik bagi saya adalah kueri asli:
sumber
nativeQuery
parameter anotasi JPA ditambahkan bukan untuk diabaikan.Jika kelas Anda
@Repository
meluas,JpaRepository
Anda dapat menggunakan contoh di bawah ini.getContent mengembalikan a
List<Transaction>
.sumber
Ini juga dimungkinkan menggunakan @QueryHints. Contoh di bawah ini menggunakan org.eclipse.persistence.config.QueryHints # JDBC_MAX_ROWS
sumber
@QueryHints({@QueryHint(name = org.hibernate.annotations.FETCH_SIZE, value = "1")})
dalam mode Hibernate, tetapi alias :( tidak berfungsinew PageRequest(0,10)
tidak berfungsi di versi Spring yang lebih baru (saya menggunakan2.2.1.RELEASE
). Pada dasarnya, konstruktor mendapat parameter tambahan sebagaiSort
tipe. Selain itu, konstruktornyaprotected
jadi Anda harus menggunakan salah satu kelas turunannya atau memanggilof
metode statisnya:Anda juga dapat menghilangkan penggunaan
Sort
parameter dan secara implisit menggunakan pengurutan default (urutkan berdasarkan pk, dll.):Deklarasi fungsi Anda harus seperti ini:
dan fungsinya adalah:
sumber