[Spring Boot] Querydsl

8558 ワード

Querydsl? JPQL?


QuerydslはJPQLビルダー
JPQL:文字(ランタイムエラー)、Querydsl:コード(コンパイル時エラー)
JPQL:直接バインドパラメータ;Querydsl:自動処理パラメータバインド

JPAQueryFactory?


JPAQueryFactory queryFactory;
Query dslを使用したオブジェクトを作成!
条件生成=検索条件Yes.and() , . メソッドチェーンにor()を接続する
select+from=selectfromが使用可能

演算子の指定

member.username.eq("member1") // username = 'member1'
member.username.ne("member1") //username != 'member1'
member.username.eq("member1").not() // username != 'member1'
member.username.isNotNull() //이름이 is not null
member.age.in(10, 20) // age in (10,20)
member.age.notIn(10, 20) // age not in (10, 20)
member.age.between(10,30) //between 10, 30
member.age.goe(30) // age >= 30
member.age.gt(30) // age > 30
member.age.loe(30) // age <= 30
member.age.lt(30) // age < 30
member.username.like("member%") //like 검색
member.username.contains("member") // like ‘%member%’ 검색
member.username.startsWith("member") //like ‘m

Fetchタイプ


fetch():クエリーリスト、データがなければ空のリストを返す
fetchOne():シングルポイントクエリー
結果がない場合:null
結果が2つを超える場合:com.querydsl.core.NonUniqueResultException
fetchFirst() : limit(1).fetchOne()
fetchResults():ページング情報を含み、合計クエリーの追加を実行
fetchCount():countクエリーに変更してcountカウントを表示

*ソート・タイプ


desc()、asc():一般ソート
nullsLast()、nullsFirst():nullデータでソート

*サイン


join(別名として使用されるターゲットのQタイプ)
join(),innerJoin():内部結合(inner join)
左Join():左外部結合(左外部結合)
rightJoin():rigth外部結合(rigth outer join)
Fetch結合を提供してJPQLのonと性能を最適化する
3つのダチョウ-関連のないフィールドに接続します
=fromセクションで複数のエンティティを選択して、3つの他の結合を作成します.
「外部結合不可」で説明する結合onを使用して外部結合を行う

!!: onセクションを使用して結合ターゲットをフィルタする場合は、外部結合ではなく内部結合(inner join)を使用します。


whereセクションのフィルタ機能と同じです.従って、「ON」節を用いる連合ターゲットフィルタリングを行う場合、
この機能は、外部結合が必要な場合にのみ使用されます.

注意!


文法をよく見なければならない.左側の結合()セクションには、通常の結合とは異なり、1つのエンティティのみが含まれます.
一般結合:leftJoin(member.team,team)
on結合:from(member).leftJoin(team).on(xxx)

fromセクションのサブクエリー制限


JPA JPQLサブクエリの限界はfromセクションのサブクエリ(インラインビュー)をサポートしません.もちろんQuerydslです
支援もしない.Hypernetインプリメンテーションを使用すると、selectセクションのサブクエリがサポートされます.Querydsl図
仮想インプリメンテーションを使用してselectセクションのサブクエリをサポートします.

fromセクションのサブクエリーソリューション

  • サブクエリをjoinに変更します.△可能な場合もあれば、不可能な場合もある.
  • アプリケーションで2回の分離クエリーが実行されます.
  • オリジナルSQLを使用します.
  • Case文


    select、条件セクション(where)、order byで使用可能
    投影-何を取るかを決める!
    1つのターゲット-タイプの決定
    ターゲットメッシュ-調整可能またはDTOに設定
    tuple-クエリーdsl複数のクエリー時に事前に作成されたタイプ
  • は実用的ではありません.
  • DTOを使用してより多くの結果を返します...
    JPQL
    純JPAでDTOを照会する場合はnewコマンドを使用する必要があります
    DTOのパッケージ名は全て書かないといけないのでめちゃくちゃ
    コンストラクション関数のみサポート
    生成者はtypeを表示してアクセスする必要があります.
    ExpressionUtils.as(source,alias):フィールドまたはサブクエリに別名を適用
    username.as(「memberName」):フィールドに別名を適用

    投影結果は仮定数を返します


    1.Setter
    2.field
    3.Constructor

    @QueryProjection


    =使用を続けると、dtoはqファイルを生成することもできます.
    =コンパイラを使用してタイプをチェックできるため、この方法が最も安全です.

    -ダイナミッククエリー


    1.boolean builderの使用
    BooleanBuilder builder = new BooleanBuilder();
    =>
  • WHrマルチパラメータ
  • サブクエリ


    com.querydsl.jpa.JPA Expressionsの使用

    マスター演算の変更、削除


    =同じ演算を同時に処理

    SQL関数の呼び出し


    =SQL functionは、JPAなどのDialect登録のコンテンツのみを呼び出します.

    純JPAリポジトリとQuerydsl


    JPAQuery FactoryはSpringBinとして登録されており、注入して使用することができます

    動的クエリーとパフォーマンス最適化クエリー-ジェネレータを使用してWHERE条件を使用


    クエリーAPIコントローラの開発


    インタフェースのサポート-Querydsl Predicatorアクチュエータ
    3つの問題を作成するquerydsl文
    <検証x>
    team a, b,c//member1,2,3
    作成者を作成する必要はありません
  • グループBのすべてのメンバー
  • が見つかりました.
    学校a、b、c/学生1、2、3、4
    2.各学校の名前と各学校の学生の体重の平均、身長の平均
    サブクエリ問題の作成
    3.学生の中で一番体重が大きい学生の名前を記入してください
    4.メンバーの平均年齢が最小メンバーに等しいシナリオクエリーの作成
  • List result = queryFactory
    .select(team.name, member.age.avg())
    .from(member)
    .join(member.team, team)
    .groupBy(team.name)
    .fetch();
  • List result = queryFactory
    .select(school.name, student.height.avg())
    .from(student)
    .join(school.student, student)
    .groupBy(school.name)
    .fetch();
  • List result = queryFactory
    .select(Student.studentname,
    JPAExpressions
    .select(StudentSub.weight.max()))
    .from(studentSub)
    .from(student)
    .fetch(); 4.List result = queryFactory
    .selectFrom(member)
    .where(member.age.eq(
    JPAExpressions
    .select(memberSub.age.min())
    .from(memberSub)
    ))
    .fetch();