<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      只為成功找方向,不為失敗找借口

      每天都不能停止前進的腳步
        博客園  :: 首頁  :: 新隨筆  :: 聯系 :: 訂閱 訂閱  :: 管理

      SpringDataJPA - 復雜查詢總結 (多表關聯 以及 自定義分頁 )

      Posted on 2018-08-20 15:56  冰碟  閱讀(9202)  評論(0)    收藏  舉報

      實體類

      @Entity
      @Table(name = "t_hotel")
      @Data
      public class THotel {
          @Id
          private int id;
          private String name;
          private String address;
          /**
           * 城市id
           */
          private String city;
      }
      
      @Entity
      @Table(name = "t_city")
      @Data
      public class TCity {
          @Id
          private int id;
          private String name;
          private String state;
          private String country;
          private String map;
      
      }

       

      新建接口

      public interface TCityRepository extends JpaRepository<TCity, Integer>, JpaSpecificationExecutor<TCity> {
      
      
      }

      單元測試類

      @RunWith(SpringRunner.class)
      @SpringBootTest
      public class TCityRepositoryTest{
      
           @Autowired
          private TCityRepository tCityRepository;
      }

       

      1.查找出Id小于3,并且名稱帶有shanghai的記錄.
      /**
       * 查找出Id小于3,并且名稱帶有`shanghai`的記錄.
       *
       * @param id   id
       * @param name 城市名稱
       * @return 城市列表
       */
      List<TCity> findByIdLessThanAndNameLike(int id, String name);

      單元測試

      @Test
      public void findByIdLessThanAndNameLike() throws Exception {
          List<TCity> shanghai = tCityRepository.findByIdLessThanAndNameLike(3, "%shanghai%");
          Assert.assertTrue(shanghai.size() > 0);
      }
      2.通過旅店名稱分頁查詢旅店以及城市的所有信息
      /**
       * 通過旅店名稱分頁查詢旅店以及城市的信息
       *
       * @param name     旅店名稱
       * @param pageable 分頁信息
       * @return Page<Object[]>
       */
      @Query(value = "select t1.name as cityName,t2.name as hotelName\n" +
              "from t_city t1\n" +
              "  left join t_hotel t2 on t2.city = t1.id\n" +
              "where t2.name = :name",
              countQuery = "select count(*)" +
                      "from t_city t1 \n" +
                      "  left join t_hotel t2 on t2.city = t1.id\n" +
                      "where t2.name = :name"
              , nativeQuery = true)
      Page<Object[]> findCityAndHotel(@Param("name") String name, Pageable pageable);

       

      為了節約時間 我只在select 與 from 之間 分別查詢了城市的名稱以及旅店的名稱如果要查所有的信息,可以換成 
      t1.* , 
      t2.*

      單元測試

      @Test
      public void findCityAndHotel() throws Exception {
          Page<Object[]> cityAndHotel = tCityRepository.findCityAndHotel("酒店", new PageRequest(0, 10));
          Assert.assertTrue(cityAndHotel.getTotalElements() > 0);
      } 

       

      3.HQL通過旅店名稱查詢旅店以及城市的所有信息

      3和2其實是一樣的,為了方便我就不作出分頁查詢了

      HQL可以用map來接受返回的參數,具體的用法如下所示:

      /**
       * HQL通過旅店名稱查詢旅店以及城市的所有信息
       *
       * @return
       */
      @Query(value = "select new map(t1,t2) from  TCity t1 left  join THotel t2 on t1.id=t2.city where t2.name =:name")
      List<Map<String, Object>> findCityAndHotelByHQL(@Param("name") String name);

       

      測試方法和2是差不多的 我就不粘貼了

      Map

      4.HQL通過旅店名稱查詢旅店以及城市的所有信息 直接返回實體類
      /**
       * 關聯查詢
       *
       * @return
       */
      @Query(value = "select new pers.zpw.domain.CityHohel(t1.name AS cityName,t2.name AS hotelName) from  TCity t1 left  join THotel t2 on t1.id=t2.city where t2.name =:name")
      List<CityHohel> findCityAndHotelByHQLResultObj(@Param("name") String name);

      為了方便CityHohel我只封裝了2個屬性,這和HQL查詢的字段是完全一致的,也必須要保持一致.

      /**
      * Created by ZhuPengWei on 2018/5/12.
      */
      @Data
      public class CityHohel {
      
              private String cityName;
              private String hotelName;
      
              public CityHohel(String cityName, String hotelName) {
                  this.cityName = cityName;
                  this.hotelName = hotelName;
              }
      }

       

      當然這個帶參的構造方法是必須要寫的,否則會拋出轉換實體的異常

      單元測試

      @Test
      public void findCityAndHotelByHQLResultObj() throws Exception {
      
          List<CityHohel> cityAndHotelByHQLResultObj = tCityRepository.findCityAndHotelByHQLResultObj("酒店");
          Assert.assertTrue(cityAndHotelByHQLResultObj.size() > 0);
      }

       

      4.HQL通過旅店名稱分頁查詢旅店以及城市的所有信息 直接返回實體類
      /**
       * 關聯查詢
       *
       * @return
       */
      @Query(value = "select new pers.zpw.domain.CityHohel(t1.name AS cityName,t2.name AS hotelName) from  TCity t1 left  join THotel t2 on t1.id=t2.city where t2.name =:name",
              countQuery = "select count(*) from  TCity t1 left  join THotel t2 on t1.id=t2.city where t2.name =:name")
      Page<CityHohel> findCityAndHotelAllSelf(@Param("name") String name, Pageable pageable);
      
          @Test
      public void findCityAndHotelAllSelf() throws Exception {
          Page<CityHohel> cityAndHotelAllSelf = tCityRepository.findCityAndHotelAllSelf("酒店", new PageRequest(0, 10));
      
          Assert.assertTrue(cityAndHotelAllSelf.getTotalElements() > 0);
      }

       

      5.動態查詢旅店以及城市的所有信息 直接返回實體類

      如果是動態查詢的話當然首先得構造一條sql去查詢了,當然如果不是自定義實體對象的話這樣的網上一大堆我就不寫了.

      直接走測試

      @Autowired
      @PersistenceContext
      private EntityManager entityManager;
      
      @Test
      public void testDynamic() throws Exception {
              String sql = "select new pers.zpw.domain.CityHohel(t1.name AS cityName,t2.name AS hotelName) from  TCity t1 left  join THotel t2 on t1.id=t2.city where t2.name ='酒店'";
              Query query = entityManager.createQuery(sql);
              List resultList = query.getResultList();
              Assert.assertTrue(resultList.size() > 0);
      }

       

      這樣測試是通過的,因此可以知道在業務層的方法中我們可以動態的構造SQL語句. 比如說可以在接口中這樣子來定義一個方法

       /**
       * 自定義查詢
       * @param sql
       * @param entityManager
       * @return
       */
      default List customQuery(String sql, EntityManager entityManager) {
          return entityManager.createQuery(sql).getResultList();
      }

       

       

       

      然后在測試類中動態的根據條件去拼接SQL語句去調用

       


      轉載:https://blog.csdn.net/qq_36144258/article/details/80298354

      主站蜘蛛池模板: 久久精品夜色噜噜亚洲av| 最新中文字幕av无码专区不| 久久大香萑太香蕉av黄软件 | 久久99精品久久久久久不卡| 亚洲一区二区三区| 体态丰腴的微胖熟女的特征| 偷拍精品一区二区三区 | 一本一道av无码中文字幕麻豆| 人妻系列无码专区免费 | 奇米四色7777中文字幕| 国产成人亚洲精品狼色在线| 中文字幕在线无码一区二区三区| 国产精品不卡一区二区三区| 免费人妻无码不卡中文18禁| 精品无码国产一区二区三区AV| 国产av丝袜熟女一二三| 男人j进入女人j内部免费网站| 国产欧美日韩亚洲一区二区三区 | 国产大尺度一区二区视频| 国产精品成人一区二区三区| 国产成人高清亚洲综合| 国产福利社区一区二区| 内射视频福利在线观看| 日韩放荡少妇无码视频| 亚洲a∨国产av综合av| 国产一级片内射在线视频| 成人午夜看黄在线尤物成人| 97免费公开在线视频| 亚洲av综合色区在线观看| 亚洲二区中文字幕在线| 波多野结衣乳喷高潮视频 | 午夜不卡欧美AAAAAA在线观看| 永靖县| 色宅男看片午夜大片啪啪| 少妇被无套内谢免费看| 亚洲中文字幕无码久久2017 | 亚洲成av人片天堂网老年人| 国产午夜福利视频在线| 性无码专区无码| 欧洲亚洲精品免费二区| 久久精品av国产一区二区|