queryDsl初学
生活随笔
收集整理的這篇文章主要介紹了
queryDsl初学
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文主要介紹springboot + jpa + query dsl的一系列操作,沒有query dsl 產品簡介。是一個通用的查詢框架,專注于通過Java API構建類型安全的SQL查詢。說的直白點就是用Java 代碼寫sql 。
附上官網文檔鏈接
http://www.querydsl.com/static/querydsl/4.2.1/reference/html_single/
1、新建一個springboot + jpa 項目
這個不多說,都會的。我使用的是postgresql 數據庫,換成mysql 或其他也可以。
2、引入query dsl 的maven依賴
3、各種sql組合嘗試
1.簡單組合
// 兩種寫法 // fetchOne查詢一條,當匹配到兩條數據時會報錯jpaQueryFactory.selectFrom(qStudent).where(qStudent.studentName.eq(studentName)).fetchOne(); // sql:select student0_.student_id as student_1_0_, student0_.student_address as student_2_0_, student0_.student_age as student_3_0_, student0_.student_name as student_4_0_, student0_.student_sex as student_5_0_ from td_student student0_ where student0_.student_name='小明';// fetchFirst 后面會拼接一個 (limit 1),在多個結果中只查詢一條jpaQueryFactory.selectFrom(qStudent).where(qStudent.studentName.eq(studentName)).fetchFirst(); // sql:select student0_.student_id as student_1_0_, student0_.student_address as student_2_0_, student0_.student_age as student_3_0_, student0_.student_name as student_4_0_, student0_.student_sex as student_5_0_ from td_student student0_ where student0_.student_name='小明' limit 1;// 查詢條件,用逗號也表示and jpaQueryFactory.selectFrom(qStudent).where(qStudent.studentAge.eq(studentAge), qStudent.studentName.eq(studentName)).fetch(); // sql:select student0_.student_id as student_1_2_, student0_.student_address as student_2_2_, student0_.student_age as student_3_2_, student0_.student_name as student_4_2_, student0_.student_sex as student_5_2_ from td_student student0_ where student0_.student_age=18 and student0_.student_name='張三';jpaQueryFactory.selectFrom(qStudent) .where(qStudent.studentAge.eq(studentAge).and(qStudent.studentName.eq(studentName))).fetch(); // sql:select student0_.student_id as student_1_2_, student0_.student_address as student_2_2_, student0_.student_age as student_3_2_, student0_.student_name as student_4_2_, student0_.student_sex as student_5_2_ from td_student student0_ where student0_.student_age=18 and student0_.student_name='張三';2.動態添加查詢條件(where條件)
BooleanBuilder booleanBuilder = new BooleanBuilder(); if (studentAge != null){booleanBuilder.and(qStudent.studentAge.eq(studentAge)); } if (StringUtils.hasText(studentName)){booleanBuilder.and(qStudent.studentName.eq(studentName)); } jpaQueryFactory.selectFrom(qStudent).where(booleanBuilder).fetch(); // sql: select student0_.student_id as student_1_2_, student0_.student_address as student_2_2_, student0_.student_age as student_3_2_, student0_.student_name as student_4_2_, student0_.student_sex as student_5_2_ from td_student student0_ where student0_.student_age=18 and student0_.student_name='張三';// Predicate 初始化需要賦值 ,給一個 1=1的條件 Predicate predicate = qStudent.studentId.isNotNull(); if (studentAge != null){predicate = ExpressionUtils.and(predicate, qStudent.studentAge.eq(studentAge)); } if (StringUtils.hasText(studentName)){predicate = ExpressionUtils.and(predicate, qStudent.studentName.eq(studentName)); } jpaQueryFactory.selectFrom(qStudent).where(booleanBuilder).fetch(); // sql: select student0_.student_id as student_1_2_, student0_.student_address as student_2_2_, student0_.student_age as student_3_2_, student0_.student_name as student_4_2_, student0_.student_sex as student_5_2_ from td_student student0_ where student0_.student_age=18 and student0_.student_name='張三';3.動態添加查詢條件(排序條件)
// 此處可進行動態處理 /*desc = qStudent.studentName.desc();desc = qStudent.studentAge.desc();*/// nullsFirst 空值放在第一個, nullsLast()空值放在最后 OrderSpecifier desc = qStudent.studentName.desc().nullsFirst(); jpaQueryFactory.selectFrom(qStudent).orderBy(desc).fetch(); // sql: select student0_.student_id as student_1_2_, student0_.student_address as student_2_2_, student0_.student_age as student_3_2_, student0_.student_name as student_4_2_, student0_.student_sex as student_5_2_ from td_student student0_ order by student0_.student_name desc nulls first;;// orderBy中可包含多個條件 desc = qStudent.studentName.desc().nullsLast(); jpaQueryFactory.selectFrom(qStudent).orderBy(desc, qStudent.studentId.asc()).fetch(); // sql: select student0_.student_id as student_1_2_, student0_.student_address as student_2_2_, student0_.student_age as student_3_2_, student0_.student_name as student_4_2_, student0_.student_sex as student_5_2_ from td_student student0_ order by student0_.student_name desc nulls last, student0_.student_id asc;4.動態添加查詢條件(使用子查詢)
JPQLQuery where = JPAExpressions.select(qStudent.studentId).from(qStudent).where(qStudent.studentName.eq(studentName)); jpaQueryFactory.selectFrom(qStudent).where(qStudent.studentId.in(where)).fetch(); // sql: select student0_.student_id as student_1_2_, student0_.student_address as student_2_2_, student0_.student_age as student_3_2_, student0_.student_name as student_4_2_, student0_.student_sex as student_5_2_ from td_student student0_ where student0_.student_id in (select student1_.student_id from td_student student1_ where student1_.student_name='張三');查詢中的其他操作:
常用操作地址
https://blog.csdn.net/weixin_43826336/article/details/98945400
總結
以上是生活随笔為你收集整理的queryDsl初学的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Splay初步【bzoj1503】
- 下一篇: 专利申请书的书写和cpc客户端的使用