Panduan untuk Querydsl dengan JPA

1. Gambaran keseluruhan

Querydsl adalah kerangka kerja Java yang luas, yang membantu membuat dan menjalankan pertanyaan selamat jenis dalam bahasa khusus domain yang serupa dengan SQL .

Dalam artikel ini kita akan meneroka Querydsl dengan Java Persistence API.

Satu catatan ringkas di sini adalah bahawa HQL untuk Hibernate adalah bahasa sasaran pertama untuk Querydsl, tetapi pada masa ini ia menyokong JPA, JDO, JDBC, Lucene, Hibernate Search, MongoDB, Collections dan RDFBean sebagai backend.

2. Persediaan

Mari kita tambahkan kebergantungan yang diperlukan ke dalam projek Maven kami:

 2.5.0   com.querydsl querydsl-apt ${querydsl.version} provided   com.querydsl querydsl-jpa ${querydsl.version}   org.slf4j slf4j-log4j12 1.6.1 

Dan sekarang mari kita konfigurasikan plugin Maven APT:

   ...  com.mysema.maven apt-maven-plugin 1.1.3    process   target/generated-sources com.querydsl.apt.jpa.JPAAnnotationProcessor     ...   

The JPAAnnotationProcessor akan mencari jenis domain dijelaskan dengan javax.persistence.Entity anotasi dan menjana Pertanyaan jenis untuk mereka.

3. Pertanyaan Dengan Querydsl

Pertanyaan dibina berdasarkan jenis pertanyaan yang dihasilkan yang menggambarkan sifat jenis domain anda. Panggilan fungsi / kaedah dibina dengan cara selamat sepenuhnya jenis.

Laluan dan operasi pertanyaan adalah sama dalam semua pelaksanaan dan juga antara muka Permintaan mempunyai antara muka asas yang sama.

3.1. Entiti dan Jenis Pertanyaan Querydsl

Mari kita tentukan entiti mudah yang akan kita gunakan semasa kita melalui contoh:

@Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column private String firstname; @Column private String surname; Person() { } public Person(String firstname, String surname) { this.firstname = firstname; this.surname = surname; } // standard getters and setters }

Querydsl akan menghasilkan jenis pertanyaan dengan nama ringkas QPerson ke dalam pakej yang sama dengan Person . QPerson boleh digunakan sebagai pemboleh ubah yang ditaip secara statik dalam pertanyaan Querydsl sebagai wakil untuk jenis Orang .

Pertama - QPerson mempunyai pemboleh ubah contoh lalai yang dapat diakses sebagai medan statik:

QPerson person = QPerson.person;

Sebagai alternatif anda boleh menentukan pemboleh ubah Person anda sendiri seperti ini:

QPerson person = new QPerson("Erich", "Gamma");

3.2. Bina Pertanyaan Menggunakan JPAQuery

Kami sekarang boleh menggunakan contoh JPAQuery untuk pertanyaan kami:

JPAQuery query = new JPAQuery(entityManager);

Perhatikan bahawa entitiManager adalah JPA EntityManager .

Sekarang mari dapatkan semua orang dengan nama pertama " Kent " sebagai contoh ringkas:

QPerson person = QPerson.person; List persons = query.from(person).where(person.firstName.eq("Kent")).list(person);

Yang dari panggilan mentakrifkan sumber pertanyaan dan unjuran, yang mana sebahagian mentakrifkan penapis dan senarai memberitahu Querydsl untuk kembali semua elemen dipadankan.

Kami juga boleh menggunakan beberapa penapis:

query.from(person).where(person.firstName.eq("Kent"), person.surname.eq("Beck"));

Atau:

query.from(person).where(person.firstName.eq("Kent").and(person.surname.eq("Beck")));

Dalam bentuk JPQL asli, pertanyaan akan ditulis seperti ini:

select person from Person as person where person.firstName = "Kent" and person.surname = "Beck"

Sekiranya anda ingin menggabungkan penapis melalui "atau", kemudian gunakan corak berikut:

query.from(person).where(person.firstName.eq("Kent").or(person.surname.eq("Beck")));

4. Pemesanan dan Pengumpulan di Querydsl

Sekarang mari kita lihat bagaimana pesanan dan agregasi berfungsi di perpustakaan Querydsl.

4.1. Memesan

Kami akan memulakan dengan menyusun keputusan kami mengikut urutan menurun dengan nama keluarga :

QPerson person = QPerson.person; List persons = query.from(person) .where(person.firstname.eq(firstname)) .orderBy(person.surname.desc()) .list(person);

4.2. Pengagregatan

Mari sekarang gunakan agregasi sederhana, kerana kita mempunyai beberapa yang tersedia (Jumlah, Purata, Maksimum, Min):

QPerson person = QPerson.person; int maxAge = query.from(person).list(person.age.max()).get(0);

4.3. Gabungan Dengan GroupBy

The com.mysema.query.group.GroupBy kelas menyediakan pengagregatan fungsi yang boleh kita gunakan untuk hasil pertanyaan agregat dalam ingatan.

Inilah contoh ringkas di mana hasilnya dikembalikan sebagai Peta dengan nama pertama sebagai kunci dan usia maksimum sebagai nilai:

QPerson person = QPerson.person; Map results = query.from(person).transform( GroupBy.groupBy(person.firstname).as(GroupBy.max(person.age)));

5. Menguji Dengan Querydsl

Sekarang, mari kita tentukan pelaksanaan DAO menggunakan Querydsl - dan mari kita tentukan operasi carian berikut:

public List findPersonsByFirstnameQuerydsl(String firstname) { JPAQuery query = new JPAQuery(em); QPerson person = QPerson.person; return query.from(person).where(person.firstname.eq(firstname)).list(person); }

Dan sekarang mari kita bina beberapa ujian menggunakan DAO baru ini dan mari kita gunakan Querydsl untuk mencari objek Person yang baru dibuat (dilaksanakan di kelas PersonDao ) dan dalam agregasi ujian lain menggunakan kelas GroupBy diuji:

@Autowired private PersonDao personDao; @Test public void givenExistingPersons_whenFindingPersonByFirstName_thenFound() { personDao.save(new Person("Erich", "Gamma")); Person person = new Person("Kent", "Beck"); personDao.save(person); personDao.save(new Person("Ralph", "Johnson")); Person personFromDb = personDao.findPersonsByFirstnameQuerydsl("Kent").get(0); Assert.assertEquals(person.getId(), personFromDb.getId()); } @Test public void givenExistingPersons_whenFindingMaxAgeByName_thenFound() { personDao.save(new Person("Kent", "Gamma", 20)); personDao.save(new Person("Ralph", "Johnson", 35)); personDao.save(new Person("Kent", "Zivago", 30)); Map maxAge = personDao.findMaxAgeByName(); Assert.assertTrue(maxAge.size() == 2); Assert.assertSame(35, maxAge.get("Ralph")); Assert.assertSame(30, maxAge.get("Kent")); }

6. Kesimpulannya

Tutorial ini menggambarkan cara membina projek JPA menggunakan Querydsl.

The pelaksanaan penuh artikel ini boleh didapati dalam projek github - ini adalah projek Maven Eclipse berasaskan, jadi ia harus mudah untuk import dan berjalan kerana ia adalah.

Nota ringkas di sini adalah - jalankan build maven sederhana (pemasangan bersih mvn) untuk menghasilkan jenis menjadi target / sumber yang dihasilkan - dan kemudian, jika anda menggunakan Eclipse - sertakan folder tersebut sebagai folder sumber projek.