คำนำ
นักเรียนที่ใช้ Spring Data JPA มีความชัดเจนมากว่ามันยังค่อนข้างซับซ้อนในการประมวลผลการสืบค้น SQL ที่ซับซ้อนและ querydsl ในบทความนี้ใช้เพื่อทำให้การดำเนินงานของ JPA ง่ายขึ้น
querydsl กำหนดไวยากรณ์ประเภทคงที่ที่ใช้กันทั่วไปสำหรับการสืบค้นข้อมูลโมเดลโดเมนแบบถาวร JDO และ JPA เป็นเทคโนโลยีการรวมหลักของ Querydsl บทความนี้มีวัตถุประสงค์เพื่ออธิบายวิธีการใช้ QueryDSL ร่วมกับ JPA QueryDSL ของ JPA เป็นทางเลือกแทนการสอบถาม JPQL และเกณฑ์ Querydsl เป็นเพียงกรอบการสืบค้นทั่วไปที่มุ่งเน้นไปที่การสอบถาม SQL ที่ปลอดภัยต่ออาคารผ่าน Java API
ในการใช้ querydsl จำเป็นต้องมีการดำเนินการสองประการ:
1. เพิ่มการพึ่งพาไฟล์ POM
<!-Query DSL-> <การพึ่งพา> <roupId> com.querydsl </groupId> <ratifactId> querydsl-jpa </artifactid> </การพึ่งพาอาศัย> <การพึ่งพา> <roupid> com.querydsl </groupid>
2. เพิ่มปลั๊กอินการรวบรวมลงในไฟล์ POM
<Plugin> <SloupId> com.mysema.maven </groupId> <ratifactid> apt-maven-plugin </artifactid> <cersion> 1.1.3 </เวอร์ชัน> <การดำเนินการ> <การดำเนินการ> <goals> <Pressor> com.QuerydSl.apt.jpa.jpaannotationProcessor </processor> </การกำหนดค่า> </Execution> </Executions> </plugin>
ปลั๊กอินมองหาประเภทโดเมนที่มีคำอธิบายประกอบด้วย javax.persistence.entity และสร้างประเภทการสืบค้นที่สอดคล้องกันสำหรับพวกเขา ต่อไปนี้เป็นคลาสเอนทิตีของผู้ใช้เพื่อแสดงให้เห็นและประเภทการสืบค้นที่สร้างขึ้นมีดังนี้:
แพ็คเกจ com.chhliu.springboot.jpa.entity; นำเข้า com.querydsl.core.types.pathmetadatafactory.*; นำเข้า com.querydsl.core.types.dsl.*; นำเข้า com.querydsl.core.types.pathmetadata; นำเข้า javax.annotation.generated; นำเข้า com.querydsl.core.types.path; / ** * QUSER เป็นประเภทการสืบค้นแบบสอบถามสำหรับผู้ใช้ */ @Generated ("com.QuerydSl.CodeGen.EntitySerializer") ชั้นเรียนสาธารณะ QUSER ขยาย EntityPathBase <ผู้ใช้> {ส่วนตัวคงที่ ผู้ใช้ QUSER สุดท้ายคงที่ = ใหม่ QUSER ("ผู้ใช้"); Public Final StringPath ที่อยู่ = createstring ("ที่อยู่"); Public NumberPath สุดท้าย <Integer> อายุ = CreateNumber ("อายุ", Integer.class); NumberPath สุดท้ายสาธารณะ <Integer> id = createNumber ("id", integer.class); Public Final StringPath Name = createstring ("ชื่อ"); สาธารณะ QUSER (ตัวแปรสตริง) {super (user.class, forvariable (ตัวแปร)); } สาธารณะ QUSER (PATH <? ขยายผู้ใช้> พา ธ ) {super (path.getType (), path.getMetadata ()); } สาธารณะ quser (pathmetadata metadata) {super (user.class, metadata); - หลังจากที่เราได้สร้างคลาสเอนทิตีแล้วเรียกใช้คำสั่ง MVN Clean Compli และมันจะเป็น
<EutputDirectory> เป้าหมาย/การสร้างแหล่งข้อมูล/java </utputDirectory>
สร้างประเภทการสืบค้นที่สอดคล้องกันในไดเรกทอรี จากนั้นคัดลอกคลาสที่สร้างขึ้นทั้งหมดไปยังโครงการเพียงทำ
เอนทิตีที่เกี่ยวข้องในบทความนี้มีดังนี้:
แพ็คเกจ com.chhliu.springboot.jpa.entity; นำเข้า java.io.serializable; นำเข้า Javax.persistence.entity; นำเข้า Javax.persistence.GeneratedValue; นำเข้า Javax.persistence.generationType; นำเข้า Javax.persistence.id; นำเข้า Javax.persistence.Table; @ENTITY @Table (name = "t_user") ผู้ใช้ระดับสาธารณะใช้การใช้งาน serializable { / ** * * / ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = 1l; @id () @GeneratedValue (กลยุทธ์ = GenerationType.Auto) ID int ส่วนตัว; ชื่อสตริงส่วนตัว; ที่อยู่สตริงส่วนตัว อายุ int ส่วนตัว; …………ละเว้น getter วิธีการตั้งค่า…………/ ** * ความสนใจ: * รายละเอียด: สะดวกในการดูผลการทดสอบ * @author chhliu */ @Override สตริงสาธารณะ toString () {return "ผู้ใช้ [id =" + id + ", ชื่อ =" + ชื่อ + ", ที่อยู่ =" + ที่อยู่ + ", อายุ =" -คลาสเอนทิตีด้านบนส่วนใหญ่ใช้สำหรับการดำเนินการตารางเดี่ยว
แพ็คเกจ com.chhliu.springboot.jpa.entity; นำเข้า Javax.persistence.cascadetype; นำเข้า Javax.persistence.entity; นำเข้า Javax.persistence.GeneratedValue; นำเข้า Javax.persistence.id; นำเข้า Javax.persistence.onetoone; นำเข้า Javax.persistence.Table; / ** * คำอธิบาย: todo * @author chhliu */ @Entity @table (name = "person") บุคคลชั้นเรียนสาธารณะ {@id @GeneratedValue ID จำนวนเต็มส่วนตัว; ชื่อสตริงส่วนตัว; ที่อยู่สตริงส่วนตัว @onetoone (mappedby = "person", cascade = {cascadetype.persist, cascadetype.remove, cascadetype.merge}) Idcard Idcard ส่วนตัว; …………ละเว้น getter วิธีการตั้งค่า………… @Override สตริงสาธารณะ toString () {return "บุคคล [id =" + id + ", name =" + name + ", address =" + ที่อยู่ + ", idcard =" + Idcard + "]"; - แพ็คเกจ com.chhliu.springboot.jpa.entity; นำเข้า Javax.persistence.cascadetype; นำเข้า Javax.persistence.entity; นำเข้า javax.persistence.fetchtype; นำเข้า Javax.persistence.GeneratedValue; นำเข้า Javax.persistence.id; นำเข้า Javax.persistence.onetoone; นำเข้า Javax.persistence.Table; / ** * คำอธิบาย: * @author chhliu */ @Entity @Table (name = "IdCard") IDCARD คลาสสาธารณะ {@ID @IneratedValue ID จำนวนเต็มส่วนตัว; idno สตริงส่วนตัว; @onetoone (cascade = {cascadetype.merge, cascadetype.remove, cascadetype.persist}, fetch = fetchtype.eager) บุคคลส่วนตัว; …………ละเว้น getter, วิธีการตั้งค่า………… @Override สตริงสาธารณะ toString () {return” idcard [id =” + id +”, idno =” + idno +”, person =” + person +”]”; -เอนทิตีสองตัวข้างต้นส่วนใหญ่จะใช้ตัวอย่างเช่นการดำเนินการของความสัมพันธ์แบบหนึ่งต่อหนึ่ง
แพ็คเกจ com.chhliu.springboot.jpa.entity; นำเข้า java.util.list; นำเข้า Javax.persistence.cascadetype; นำเข้า Javax.persistence.column; นำเข้า Javax.persistence.entity; นำเข้า javax.persistence.fetchtype; นำเข้า Javax.persistence.GeneratedValue; นำเข้า Javax.persistence.id; นำเข้า Javax.persistence.onetomany; นำเข้า Javax.persistence.Table; / *** คำอธิบาย: คลาสเอนทิตีสั่งซื้อ* @author chhliu*/ @Entity @Table (name = "order_c") การสั่งซื้อคลาสสาธารณะ {@id @Id @IneratedValue @Column (name = "id") ID จำนวนเต็มส่วนตัว; @column (length = 20, name = "order_name") สตริงส่วนตัว ordername; @column (name = "count") จำนวนจำนวนเต็มส่วนตัว; @Onetomany (mappedby = "order", cascade = {cascadetype.persist, cascadetype.remove}, fetch = fetchType.eager) รายการส่วนตัว <OrderItem> orderItems; ………ละเว้น getter วิธีการตั้งค่า……} แพ็คเกจ com.chhliu.springboot.jpa.entity; นำเข้า Javax.persistence.cascadetype; นำเข้า Javax.persistence.column; นำเข้า Javax.persistence.entity; นำเข้า javax.persistence.fetchtype; นำเข้า Javax.persistence.GeneratedValue; นำเข้า Javax.persistence.id; นำเข้า Javax.persistence.Joincolumn; นำเข้า javax.persistence.manytoone; นำเข้า Javax.persistence.Table; / *** คำอธิบาย: คลาสเอนทิตีของคำสั่ง* @author chhliu*/ @Entity @Table (name = "order_item") คลาสสาธารณะ orderItem {@id @Id @GeneratedValue @column (name = "id", nullable = false) @column (name = "item_name", length = 20) สตริงส่วนตัว itemName; @Column (name = "ราคา") ราคาจำนวนเต็มส่วนตัว; @ManytoOne (cascade = {cascadetype.persist, cascadetype.remove, cascadetype.merge}, fetch = fetchType.eager) @Joincolumn (ชื่อ = "order_id") คำสั่งซื้อส่วนตัว; …………ละเว้น getter วิธีการตั้งค่า………} เอนทิตีสองตัวข้างต้นใช้เพื่อแสดงตัวอย่างการดำเนินงานของความสัมพันธ์แบบหนึ่งต่อหลายคน
ก่อนอื่นมาดูการทำงานของตารางเดียว
1. ใช้ Spring Data JPA
ในการใช้ฟังก์ชั่น querydsl ที่จัดทำโดย Spring Data JPA มันง่ายมากเพียงแค่สืบทอดอินเทอร์เฟซโดยตรง Spring Data JPA จัดเตรียมอินเทอร์เฟซ querydslpredicateExecutor ซึ่งใช้เพื่อรองรับอินเตอร์เฟสการดำเนินการคิวรีคแบบคิวรีส query ดังต่อไปนี้:
แพ็คเกจ com.chhliu.springboot.jpa.repository; นำเข้า org.springframework.data.jpa.repository.jparepository; นำเข้า org.springframework.data.querydsl.QuerydSlPredicateExecutor; นำเข้า com.chhliu.springboot.jpa.entity.user; อินเทอร์เฟซสาธารณะ userRepositoryDls ขยาย jParePository <ผู้ใช้จำนวนเต็ม>, querydslpredicateExecutor <ผู้ใช้> {// อินเตอร์เฟสการสืบทอด}}อินเตอร์เฟส querydslpredicateExecutor ให้วิธีการต่อไปนี้:
อินเทอร์เฟซสาธารณะ querydslpredicateExecutor <t> {t findone (predicate ทำนาย); iterable <t> findall (predicate ทำนายเรียงลำดับ); iterable <t> findall (Predicate Predict, OrdersPecifier <?> ... คำสั่งซื้อ); iterable <t> findall (orderspecifier <?> ... คำสั่งซื้อ); หน้า <t> findall (คาดการณ์เพรดิเคตซึ่งสามารถแยกเพดานได้); นับยาว (คาดการณ์เพรดิเคต); บูลีนมีอยู่ (ภาคแสดง); - การใช้วิธีการข้างต้นนั้นคล้ายกับวิธีการใช้งานอินเตอร์เฟสอื่น ๆ ในสปริงข้อมูล JPA สำหรับรายละเอียดโปรดดูที่: http://www.vevb.com/article/137757.htm
การทดสอบมีดังนี้:
ผู้ใช้สาธารณะ FindUserByUserName (ชื่อผู้ใช้สตริงสุดท้าย) { / ** * ตัวอย่างนี้คือการใช้สปริงข้อมูล querydsl เพื่อใช้งาน * / quser quser = quser.user; Predicate Predicate = quser.name.eq (ชื่อผู้ใช้); // ตามชื่อผู้ใช้, การสืบค้นตารางผู้ใช้ส่งคืนที่เก็บข้อมูล Findone (เพรดิเคต); -SQL ที่เกี่ยวข้องมีดังนี้:
การคัดลอกรหัสมีดังนี้: เลือก user0_.id เป็น id1_5_, user0_.address เป็น address2_5_, user0_.age เป็น Age3_5_, user0_.name เป็น name4_5_ จาก t_user user0_ โดยที่ผู้ใช้ 0_.name =?
รหัสตัวอย่างการดำเนินการตารางเดียวมีดังนี้:
แพ็คเกจ com.chhliu.springboot.jpa.repository; นำเข้า java.util.list; นำเข้า Javax.persistence.entityManager; นำเข้า javax.persistence.persistenceContext; นำเข้า javax.persistence.query; นำเข้า Javax.transaction.transactional; นำเข้า org.springframework.beans.factory.annotation.autowired; นำเข้า org.springframework.data.domain.pageRequest; นำเข้า org.springframework.data.domain.sort; นำเข้า org.springframework.steretype.component; นำเข้า com.chhliu.springboot.jpa.entity.quser; นำเข้า com.chhliu.springboot.jpa.entity.user; นำเข้า com.querydsl.core.types.predicate; นำเข้า com.querydsl.jpa.impl.jpaQueryFactory; / ** * คำอธิบาย: querydsl jpa * @author chhliu */ @component @transactional คลาสสาธารณะ userrepositorymanagerdsl {@autowired ส่วนตัว userrepositorydls; @autowired @persistenceContext Private EntityManager EntityManager; jpaQueryFactory ส่วนตัว queryfactory; @PostConstruct โมฆะสาธารณะ init () {queryFactory = ใหม่ jpaQueryFactory (EntityManager); } ผู้ใช้ FindUserByUserName (ชื่อผู้ใช้สตริงสุดท้าย) { / ** * ตัวอย่างนี้คือการใช้สปริงข้อมูล querydsl เพื่อใช้งาน * / quser quser = quser.user; predicate predict = quser.name.eq (ชื่อผู้ใช้); return repository.findone (ภาคแสดง); } / *** ความสนใจ:* รายละเอียด: สอบถามบันทึกทั้งหมดในตารางผู้ใช้* / รายการสาธารณะ <user> findall () {quser quser = quser.user; return queryfactory.selectfrom (quser) .fetch (); } / *** รายละเอียด: การสืบค้น condition เดี่ยว* / ผู้ใช้สาธารณะ findOneByUserName (ชื่อผู้ใช้สตริงสุดท้าย) {QUSER QUSER = QUSER.USER; return queryfactory.selectfrom (quser) .where (quser.name.eq (ชื่อผู้ใช้)) .fettone (); } / *** รายละเอียด: แบบสอบถามหลายเงื่อนไขตารางเดี่ยว* / ผู้ใช้สาธารณะ findOneByEnmeRameAnDaddress (ชื่อผู้ใช้สตริงสุดท้าย, ที่อยู่สตริงสุดท้าย) {QUSER QUSER = QUSER.USER; return queryfactory.select (quser). จาก (quser) // สองประโยคข้างต้นเทียบเท่ากับ selectfrom .where (quser.name.eq (ชื่อผู้ใช้) และ (quser.address.eq (ที่อยู่)) // รหัสนี้เทียบเท่ากับที่ } / *** รายละเอียด: ใช้การสืบค้นเข้าร่วม* / รายการสาธารณะ <ผู้ใช้> findUsersByJoin () {QUSER QUSER = QUSER.USER; quser username = new Quser ("ชื่อ"); return queryfactory.selectfrom (quser) .innerjoin (quser) .on (quser.id.intvalue (). eq (username.id.intvalue ())) .fetch (); } / ** * รายละเอียด: เรียงลำดับผลลัพธ์การสืบค้น * / รายการสาธารณะ <ผู้ใช้> findUserAndOrder () {quser quser = quser.user; return queryfactory.selectfrom (quser). orderby (quser.id.desc ()) .fetch (); } / ** * รายละเอียด: กลุ่มโดยใช้ * / รายการสาธารณะ <String> findUserByGroup () {QUSER QUSER = QUSER.USER; return queryfactory.select (quser.name). จาก (quser) .groupby (quser.name) .fetch (); } / *** รายละเอียด: ลบผู้ใช้* / Public Long Long DELETEUSER (ชื่อผู้ใช้สตริง) {QUSER QUSER = QUSER.USER; return queryfactory.delete (quser) .where (quser.name.eq (ชื่อผู้ใช้)). ดำเนินการ (); } / *** รายละเอียด: อัปเดตบันทึก* / Public Long UpdateUser (ผู้ใช้สุดท้าย U, ชื่อผู้ใช้สตริงสุดท้าย) {QUSER QUSER = QUSER.USER; return queryfactory.update (quser) .where (quser.name.eq (ชื่อผู้ใช้)) .set (quser.name, u.getName ()) .set (quser.age, u.getage ()) .set (quser.address, U.getAddress () } / ** * รายละเอียด: ใช้การสืบค้นแบบดั้งเดิม * / ผู้ใช้สาธารณะ findoneUserByOriginalsQl (ชื่อผู้ใช้สตริงสุดท้าย) {QUSER QUSER = QUSER.USER; Query Query = queryFactory.selectFrom (Quser) .where (quser.name.eq (ชื่อผู้ใช้)). createquery (); return (ผู้ใช้) query.getSingLerEsult (); } / *** รายละเอียด: การสืบค้นเพดานปากเดี่ยวตาราง* / หน้าสาธารณะ <ผู้ใช้> FindAllandPager (การชดเชย int สุดท้าย, หน้า int สุดท้าย) {Predicate Predicate = quser.user.id.lt (10); sort sort = new sort (new sort.order (sort.direction.desc, "id")); PAGEREQUEST PR = ใหม่ PAGEREQUEST (ชดเชย, หน้า, เรียงลำดับ); return repository.Findall (Predicate, PR); -ตัวอย่างการทำงานหลายตาราง (หนึ่งต่อหนึ่ง) มีดังนี้:
แพ็คเกจ com.chhliu.springboot.jpa.repository; นำเข้า java.util.arraylist; นำเข้า java.util.list; นำเข้า Javax.annotation.postConstruct; นำเข้า Javax.persistence.entityManager; นำเข้า javax.persistence.persistenceContext; นำเข้า org.springframework.beans.factory.annotation.autowired; นำเข้า org.springframework.stereotype.component; นำเข้า com.chhliu.springboot.jpa.dto.personidcarddto; นำเข้า com.chhliu.springboot.jpa.entity.qidcard; นำเข้า com.chhliu.springboot.jpa.entity.qidcard; นำเข้า com.chhliu.springboot.jpa.entity.qperson; นำเข้า com.querydsl.core.queryresults; นำเข้า com.querydsl.core.tuple; นำเข้า com.querydsl.core.types.predicate; นำเข้า com.querydsl.jpa.impl.jpaQuery; นำเข้า com.querydsl.jpa.impl.jpaQueryFactory; @Component Public Class PersonAndIdCardManager {@autowired @persistenceContext EntityManager EntityManager; jpaQueryFactory ส่วนตัว queryfactory; @PostConstruct โมฆะสาธารณะ init () {queryFactory = ใหม่ jpaQueryFactory (EntityManager); } / *** รายละเอียด: แบบสอบถามแบบไดนามิกแบบหลายโต๊ะ* / รายการสาธารณะ <Tuple> FindAllPersonAndIdCard () {Predicate Predicate = (qPerson.person.IntValue ()). eq (qidcard.idcard.person.id.intValue (); jpaQuery <Tuple> jpaQuery = queryFactory.select (qidcard.idcard.idno, qperson.person.address, qperson.person.name). จาก (qidcard.idcard, qperson.person) return jpaQuery.fetch (); } / *** รายละเอียด: ผลลัพธ์การสืบค้นเอาท์พุทใน dto* / รายการสาธารณะ <personidcarddto> findbydto () {predicate predict = (qperson.person.id.intvalue ()). eq (qidcard.idcard.person.id.intvalue (); jpaQuery <Tuple> jpaQuery = queryFactory.select (qidcard.idcard.idno, qperson.person.address, qperson.person.name). จาก (qidcard.idcard, qperson.person) รายการ <Tuple> tuples = jpaQuery.fetch (); รายการ <personidcarddto> dtos = new ArrayList <PersonidCardDTO> (); if (null! = tuples &&! tuples.isempty ()) {สำหรับ (tuple tuple: tuples) {string address = tuple.get (qperson.person.address); ชื่อสตริง = tuple.get (qperson.person.name); string idcard = tuple.get (qidcard.idcard.idno); personidcarddto dto = ใหม่ personidcarddto (); dto.setaddress (ที่อยู่); dto.setidno (idcard); dto.setName (ชื่อ); dtos.add (DTO); }} ส่งคืน DTOS; } / *** รายละเอียด: แบบสอบถามแบบไดนามิกแบบหลายตารางและการแบ่งหน้า* / Public QueryResults <Tuple> findByDtoAndPager (int offset, int pageSize) {predicate predicate = (qperson.person.id.intValue ()) eq (qidcard.idcard.person.id. return queryfactory.select (qidcard.idcard.idno, qperson.person.address, qperson.person.name). จาก (qidcard.idcard, qperson.person). -ในตัวอย่างด้านบนที่ผลลัพธ์การสืบค้นถูกส่งออกในโหมด DTO หลังจากที่สืบค้นเสร็จสิ้นผลลัพธ์การสืบค้นจะถูกแปลงเป็นวัตถุ DTO ด้วยตนเอง วิธีนี้ไม่ได้สง่างามมากนัก querydsl ให้วิธีที่ดีกว่าเราดูตัวอย่างต่อไปนี้:
/ *** รายละเอียด: วิธีที่ 1: ใช้การฉายถั่ว*/ รายการสาธารณะ <PersonidCarddto> findByDtouseBean () {Predicate Predicate = (qperson.person.IntValue ()). eq (qidcard.idcard.person.IntValue ()); return queryfactory.select (projections.bean (personidcarddto.class, qidcard.idcard.idno, qperson.person.address, qperson.person.name)). จาก (qidcard.idcard, qperson.person). } / ** * รายละเอียด: วิธีการที่ 2: ใช้ฟิลด์แทน setter * / รายการสาธารณะ <PersonidCardDTO> findByDTousefields () {Predicate Predict = (qperson.person.id.intValue ()). eq (qidcard.idcard.person.id.intvalue ()); return queryfactory.select (projections.fields (personidcarddto.class, qidcard.idcard.idno, qperson.person.address, qperson.person.name)). จาก (qidcard.idcard, qperson.person). } / *** รายละเอียด: วิธีที่ 3: ใช้วิธีตัวสร้างโปรดทราบว่าลำดับของแอตทริบิวต์ในตัวสร้างจะต้องสอดคล้องกับลำดับในตัวสร้าง* / รายการสาธารณะ <PersonidCardDTO> findByDtouSeconstructor () return queryfactory.select (projections.constructor (personidcarddto.class, qperson.person.name, qperson.person.address, qidcard.idcard.idno)). จาก (qidcard.idcard, qperson.person) - ข้างต้นมีแนวคิดหลายประการเท่านั้น แน่นอนคุณยังสามารถใช้ @QueryProjection เพื่อนำไปใช้ซึ่งมีความยืดหยุ่นมาก
ตัวอย่างแบบตัวต่อตัว:
แพ็คเกจ com.chhliu.springboot.jpa.repository; นำเข้า java.util.list; นำเข้า Javax.annotation.postConstruct; นำเข้า Javax.persistence.entityManager; นำเข้า javax.persistence.persistenceContext; นำเข้า org.springframework.beans.factory.annotation.autowired; นำเข้า org.springframework.stereotype.component; นำเข้า com.chhliu.springboot.jpa.entity.qorder; นำเข้า com.chhliu.springboot.jpa.entity.qorderitem; นำเข้า com.querydsl.core.tuple; นำเข้า com.querydsl.core.types.predicate; นำเข้า com.querydsl.jpa.impl.jpaQuery; นำเข้า com.querydsl.jpa.impl.jpaQueryFactory; @Component คลาสสาธารณะคลาส OrderAndERITEMMANAGER {@AutoWired @persistenceContext Private EntityManager EntityManager; jpaQueryFactory ส่วนตัว queryfactory; @PostConstruct โมฆะสาธารณะ init () {queryFactory = ใหม่ jpaQueryFactory (EntityManager); } /*** รายละเอียด: แบบหนึ่งต่อหลายคน, แบบสอบถามแบบมีเงื่อนไข* /รายการสาธารณะ <Tuple> findOrdOrdOrdErtemByOrderName (String OrderName) {// เพิ่มเงื่อนไขการสอบถาม predicate = qorder.order.ordanname.eq (OrderName); jpaQuery <Tuple> jpaQuery = queryFactory.select (qorder.order, qorderItem.orderItem). จาก (qorder.order, qorderItem.orderItem) .where (qorderItem.orderItem.order.IntValue () eq // รับผลตอบแทน jpaQuery.fetch (); } /*** รายละเอียด: แบบสอบถามการเข้าร่วมแบบหลายตาราง* /รายการสาธารณะ <Tuple> findAllByOrderName (ordername สตริง) {// เพิ่มเงื่อนไขการสืบค้น predicate predicate = qorder.order.ordername.eq (ordername); jpaQuery <Tuple> jpaQuery = queryFactory.Select (qorder.order, qorderItem.orderItem). จาก (qorder.order, qorderItem.orderItem). rightJoin (qorder.order) jpaQuery.where (ภาคแสดง); // รับผลตอบแทน jpaQuery.fetch (); - จากตัวอย่างข้างต้นเราจะเห็นว่า querydsl ได้ทำให้การดำเนินงานของเราง่ายขึ้นอย่างมาก
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น