• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • spring data jpa簡單crud操作以及多表關聯,分頁排序,復雜條件查詢

    分頁和多表關聯查詢有多種方式

    @Query使用

    • 單表查詢所有:
    
    public interface SubjectDao extends JpaRepository<Subject,Integer>, JpaSpecificationExecutor<User>, Serializable {
       @Query(value = "select * from subject",nativeQuery = true)
       public List<Subject> ul();
    }
    
    • 單表分頁查詢
     @Test
        public void hi1(){
            Pageable page=  PageRequest.of(1,2);
            Page<Subject>kl=subjectDao.ul(page);
            System.out.println(kl.getContent().size());
            System.out.println(kl.getTotalElements());
        }
    
    public interface SubjectDao extends JpaRepository<Subject,Integer>, JpaSpecificationExecutor<User>, Serializable {
        @Query(value = "select * from subject",nativeQuery = true)
        public Page<Subject> ul(Pageable pageable);
    }
    
    • 多表分頁查詢
    public interface SubjectDao extends JpaRepository<Subject,Integer>, JpaSpecificationExecutor<User>, Serializable {
        @Query(value = "select * from subject s inner join subject_auths sa on s.id=sa.subject_id",nativeQuery = true)
        Page<Subject> ul(Pageable pageable);
    }
    

    調試結果如下:
    在這里插入圖片描述

    • 此時只能看到subject中的信息,如果我想看到與之關連的subject_auth中的信息。可以做一對一的配置

           - subject中的配置,其中subject_id是subject_auth表中的字段,它是subject的外鍵
      

    在這里插入圖片描述
    其結果如下:
    在這里插入圖片描述

    • 查詢優化
      上述都是select *查詢所有的操作。如果我只想查詢部分字段。。
      注意:想當然的如果這樣寫
    public interface SubjectDao extends JpaRepository<Subject,Integer>, JpaSpecificationExecutor<User>, Serializable {
        @Query(value = "select s.id,sa.id from subject s inner join subject_auths sa on s.id=sa.subject_id",nativeQuery = true)
        Page<Subject> ul(Pageable pageable);
    }
    
     1. 則會報
    

    Caused by: java.sql.SQLException: Column ‘business_scope’ not found.

    spring data jpa執行完查詢后,都會將結果一個一個的注入到對應的pojo的每個屬性中.但由于我只查詢sublect的id和subject_auth的id

    select
    s.id,
    sa.id
    from
    subject s
    inner join
    subject_auths sa
    on s.id=sa.subject_id limit ?,?

    所以spring data jpa就會認為你的數據庫里subject表中只有id這一個字段,subject_auth里只有id這一個字段。但你的Subject類有businessScope屬性,并且做了映射@Column(name=“business_scope”),所以它從結果集中找不到這個字段名,注入到suoject對象的businessScope屬性中,就拋出上述錯誤。

     2. 如果查出來的字段有同名的,記得取別名,否則會報錯如下:
    

    Caused by: org.hibernate.loader.custom.NonUniqueDiscoveredSqlAliasException: Encountered a duplicated sql alias [id] during auto-discovery of a native-sql query

     3. 并且還會 報==Unknown column 's' in 'field list'==
    

    運行的sql如下(你只分頁查詢了部分字段,還想做統計。此時它不知道該按照那個字段做統計 )
    select count(s) from subject s inner join subject_auths sa on s.id=sa.subject_id

    針對以上幾點問題。我做了進一步的測試

    將上述語句改寫成jpql語句

    public interface SubjectDao extends JpaRepository<Subject,Integer>, JpaSpecificationExecutor<User>, Serializable {
        @Query(value = "From Subject s inner join SubjectAuths sa on s.id=sa.subjectId")
        Page<Object> ul(Pageable pageable);
    }
    

    在這里插入圖片描述
    其相應的sql:

    Hibernate: 
        select
            subject0_.id as id1_13_0_,
            subjectaut1_.id as id1_14_1_,
            subject0_.business_scope as business2_13_0_,
            subject0_.enterprise_nature as enterpri3_13_0_,
            subject0_.estiblish_time as estiblis4_13_0_,
            subject0_.first_holder as first_ho5_13_0_,
            subject0_.name as name6_13_0_,
            subject0_.reg_capital as reg_capi7_13_0_,
            subject0_.reg_location as reg_loca8_13_0_,
            subject0_.tags as tags9_13_0_,
            subjectaut1_.auth_time as auth_tim2_14_1_,
            subjectaut1_.expiring_time as expiring3_14_1_,
            subjectaut1_.subject_id as subject_4_14_1_,
            subjectaut1_.user_id as user_id5_14_1_ 
        from
            subject subject0_ 
        inner join
            subject_auths subjectaut1_ 
                on (
                    subject0_.id=subjectaut1_.subject_id
                ) limit ?,
            ?
    Hibernate: 
        select
            count(subject0_.id) as col_0_0_ 
        from
            subject subject0_ 
        inner join
            subject_auths subjectaut1_ 
                on (
                    subject0_.id=subjectaut1_.subject_id
                )
    

    spring data jpa在使用@Query時,如果nativeQuery=true,并且只是查詢部分字段,那么進行多表聯查,結果集是List<Object[]>,它不能完成對結果集自動封裝,只能我們自己來處理結果集。我們可以寫jpql語句,再構造一個vo類型的pojo,通過select new Test(a,b,c)…讓它幫我們完成封裝。

    spring的動態代理我覺得最明顯的效果在spring data jpa中發揮的淋漓盡致。通過它完全解放了dao層的操作,可以真正讓程序員有更多時間在service層操作上。-----實現了面向接口編程。實現類有spring的代理機制給你完成。

    public interface SubjectDao extends JpaRepository<Subject,Integer>, JpaSpecificationExecutor<User>, Serializable {
        @Query(value = "select new org.mj.pojo.Test(s.id,sa.subjectId) from Subject s inner join SubjectAuths sa on s.id=sa.subjectId")
        Page<Test> ul(Pageable pageable);
    }
    
    
    
    
    @Getter
    @Setter
    public class Test implements Serializable {
        Integer id;
        Integer subjectId;
    
        public Test(Integer id,Integer subjectId){
            this.subjectId=subjectId;
            this.id=id;
        }
    }
    

    用jpql不能寫 join on應該用 join where

    antlr.SemanticException: Path expected for join!

    測試說明:

    public interface SubjectDao extends JpaRepository<Subject,Integer>, JpaSpecificationExecutor<User>, Serializable {
        @Query(value = "select s.id as sid,sa.id as said from Subject s inner join SubjectAuths sa on s.id=sa.subjectId")
        Page<Object> ul(Pageable pageable);
    }
    

    jpql語句的關聯查詢
    https://www.cnblogs.com/acm-bingzi/p/jpqlJoin.html

    Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate appropriate constructor on class [org.mj.pojo.Test]. Expected arguments are: long, int [select new org.mj.pojo.Test(s.id,sa.subjectId) from org.mj.pojo.Subject s inner join org.mj.pojo.SubjectAuths sa on s.id=sa.subjectId]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74)
    at org.hibernate.hql.internal.ast.ErrorTracker.throwQueryException(ErrorTracker.java:93)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:277)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:191)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:143)
    at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:119)
    at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153)
    at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:611)
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:720)
    … 132 more

    • 解決方案是:
    版權聲明:本文為qq_41063141原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_41063141/article/details/96499628

    智能推薦

    Spring Data JPA復雜動態查詢

    Spring Data JPA其諸多優點給我們的工作帶來了很多便利,但對于接觸不久的同學來說,有些情況讓我們頭疼。一些復雜的查詢,比如涉及到聚合函數、動態多條件等,著實有些棘手。在不夠了解的情況下,覺得Spring Data JPA在這方面不太人性化,有時候我們干脆使用原生sql粗暴的來解決這類查詢問題。但這與Spring Data JPA的初衷是相悖的,在不斷的學習中,慢慢發現Spring Da...

    Spring-Data-Jpa條件查詢

    Spring-Data-Jpa條件查詢 按照SpringData的規則,可以通過定義在Repository接口下的方法名稱來執行查詢等操作,查詢的方法名稱必須以find、get、read、開頭,同時,涉及條件查詢時,SpringDataJpa支持將條件屬性定義在數據訪問層接口下的方法名稱中,條件屬性通過條件關鍵字鏈接。需要注意的是:條件屬性的首字母必須大寫,下面來看一個案例吧。 1、創建一個spr...

    SpringBoot 簡單CRUD操作Spring-Data-JPA(四)

    Spring Data JPA 框架,主要針對的是 Spring 唯一沒有簡化到的業務邏輯代碼,至此,開發者連僅剩的實現持久層業務邏輯的工作都省了,唯一要做的,就只是聲明持久層的接口,其他都交給 Spring Data JPA 來幫你完成! JPA(Java Persistence API)定義了一系列對象持久化的標準  目前實現這一規范的產品有Hibernate、TopLin...

    spring data jpa實現分頁查詢功能

    spring data jpa實現分頁查詢功能 HTML代碼部分: Action類: Service代碼: dao層:...

    Spring Data JPA分頁與排序

    1、認識JPA的分頁接口和排序類 在項目的開發中,需要經常對數據表進行分頁和排序查詢。下面將介紹如何使用Spring Data JPA對數據進行分頁和排序。 1.1 分頁排序接口 PagingAndSortingRepository PagingAndSortingRepository 接口繼承自 CrudRepository 接口提供的分頁和排序方法。其關鍵代碼如下:  其方...

    猜你喜歡

    Unity_Shader高級篇_13.1_Unity Shader入門精要

    13.4 再談邊緣檢測 在12.3中,我們曾使用Sobel算子對屏幕圖像進行邊緣測試,實現描邊的效果。但是,這種直接利用顏色信息進行邊緣檢測的方法會產生很對我們不希望得到的邊緣線,如圖13.8所示。 可以看出,物體的紋理、陰影等位置也被描上黑邊,而這往往不是我們希望看到的。在本節中,我們將學習如何在深度和法線上進行邊緣檢測,這些圖像不會受紋理和光照的影響,而僅僅保存了當前渲染物體的模型信息,通過這...

    Seata AT 模式 原理詳解

    目錄 前提 整體機制 寫隔離 讀隔離 工作機制 一階段 二階段-回滾 二階段-提交 附錄 回滾日志表 前提 基于支持本地 ACID 事務的關系型數據庫。 Java 應用,通過 JDBC 訪問數據庫。 整體機制 兩階段提交協議的演變: 一階段:業務數據和回滾日志記錄在同一個本地事務中提交,釋放本地鎖和連接資源。 二階段: 提交異步化,非常快速地完成。 回滾通過一階段的回滾日志進行反向補償。 寫隔離 ...

    Python爬蟲 | 滑動驗證碼**

    極驗驗證碼:需要手動拼合滑塊來完成的驗證,相對圖形驗證碼識別難度上升了幾個等級。下面用程序識別并通過極驗驗證碼的驗證,其中有分析識別思路、識別缺口位置、生成滑塊拖動、模擬實現滑塊拼合通過驗證等步驟。需要用到Chrome 瀏覽器,并配置 ChromeDriver ,要用到的 Python 庫是 Selenium。 1、 對極驗驗證碼了解   極驗驗證碼官網:http://www.geetest.co...

    MobaXterm root用戶連接虛擬機時出現Access denied

    1.linux打開ssh服務 2.新建連接 首先在romote host中填入要連接的主機ip specify username中填入連接的用戶名 port為連接端口默認為22 輸入連接用戶的密碼 linux默認不顯示密碼 發現密碼正確但是連接不上 問題解決 /etc/ssh/sshd_config 配置問題: #PermitRootLogin prohibit-password將該行改為Perm...

    Linux C 預處理命令

    預處理命令 一、宏定義 C語言標準允許在程序中用一個標識符來表示一個字符串,成為宏。標識符為宏名 ,在編譯預處理時,將程序中所有的宏名用相應的字符串來替換,這個過程稱為宏替換,宏分為兩種:無參數的宏和有參數的宏。 1.無參數的宏 無參數宏定義的一般形式為:#define 標識符字符串 “#”代表本行是編譯預處理命令。define是宏定義的關鍵詞,標識符是宏名。字符串是宏名所...

    精品国产乱码久久久久久蜜桃不卡