1. 程式人生 > >jpa高階註解

jpa高階註解

本文為轉載部落格
博主原創文章: https://blog.csdn.net/cheidou123/article/details/84435867

一、@NamedQuery

就是直接在entity中定義sql語句,這種方式並不建議用;

1 entity配置

使用@NamedQuery註解在實體類中定義命名查詢。

@NamedQuery(name="findAllUser",query="SELECT u FROM User u")

  

    @NamedQuery中的屬性name指定命名查詢的名稱,query屬性指定命名查詢的語句。
    如果要定義多個命名查詢,需要使用@NamedQueries。

     @NamedQueries({
               @NamedQuery(name="findAllUser",query="SELECT u FROM User u"),
               @NamedQuery(name="findUserWithId",query="SELECT u FROM User u WHERE u.id = ?1"),
          })
    
      
      2 傳入查詢條件

      定義好命名查詢後,可以使用EntityManager的createNamedQuery 方法傳入命名查詢的名稱建立查詢。例如:createNamedQuery(“findAllUser”);

      3 例子
          @Test
          public void testNamedQuery2() {
              EntityManager em = emf.createEntityManager();
              Query query =  em.createNamedQuery("findUserWithId");//根據User實體中定義的命名查詢
              query.setParameter(1, 2L);
              List<User> users = query.getResultList();
          }
      
      

      二、@Transactional

      和query註解搭配一起用,表示開啟事務

      三、@Modifying

      和query註解搭配使用,表示增加,刪除,修改,使用它時一定要加上事務配置,可以和上面的@Transactional一起使用。
      這個註解有個clearAutomatically=true的配置,加上這個配置可以清理快取,防止在一個sqlSession中查詢不一致,一個sqlSession就是一個事務,具體應看@Transactional註解加到什麼位置。

      四、@Query

      如果@Query註解加上nativeQuery=true 則查詢語句使用原生sql,不加則使用HQL
      jpa @Query中使用in,需要注意引數一定要是List<>,不然無法查詢出資料

      1 在引數繫結上,我們主要採用這兩種方式
      ⑴採用佔位符的方式
      @Query(value = "select t from User t where t.id = ?1  order by t.code")
      List<User> getListById(String id);
      
           
        ⑵採用params的方式
         @Query("select t from Task t where t.taskName = :taskName and t.createTime = :createTime")
         Task findByTaskName(@Param("taskName")String taskName,@Param("createTime") Date createTime);
        
               
          2 前端查詢框

          我們在專案中經常使用前端查詢框,前端查詢框有的時候傳了,而有的時候沒有傳。

          五、使用Sort進行排序

          1.排序一共有四種方法
          直接建立Sort物件,適合對單一屬性做排序
          通過Sort.Order物件建立Sort物件,適合對單一屬性做排序
          通過屬性的List集合建立Sort物件,適合對多個屬性,採取同一種排序方式的排序
          通過Sort.Order物件的List集合建立Sort物件,適合所有情況,比較容易設定排序方式
          2 例項
          /**
           * @Query註解方式查詢,
           * 用@Param指定引數,匹配firstName和lastName
           */
          @RequestMapping("/findByName")
          public void findByName4(){
              //按照ID倒序排列
              System.out.println("直接建立sort物件,通過排序方法和屬性名");
              Sort sort = new Sort(Sort.Direction.DESC,"id");
              List<Customer>; result = repository.findByName4("Bauer",sort);
              for (Customer customer:result){
                  System.out.println(customer.toString());
              }
              System.out.println("-------------------------------------------");
              //按照ID倒序排列
              System.out.println("通過Sort.Order物件建立sort物件");
              Sort sortx = new Sort(new Sort.Order(Sort.Direction.DESC,"id"));
              List<Customer> resultx = repository.findByName4("Bauer",sort);
              for (Customer customer:result){
                  System.out.println(customer.toString());
              }
              System.out.println("-------------------------------------------");
              System.out.println("通過排序方法和屬性List建立sort物件");
              List<String> sortProperties = new ArrayList<>();
              sortProperties.add("id");
              sortProperties.add("firstName");
              Sort sort2 = new Sort(Sort.Direction.DESC,sortProperties);
              List<Customer> result2 = repository.findByName4("Bauer",sort2);
              for (Customer customer:result2){
                  System.out.println(customer.toString());
              }
              System.out.println("-------------------------------------------");
            System.out.println("通過建立Sort.Order物件的集合建立sort物件");
              List<Sort.Order> orders = new ArrayList<>();
              orders.add(new Sort.Order(Sort.Direction.DESC,"id"));
              orders.add(new Sort.Order(Sort.Direction.ASC,"firstName"));
              List<Customer> result3 = repository.findByName4("Bauer",new Sort(orders));
              for (Customer customer:result3){
                  System.out.println(customer.toString());
              }
              System.out.println("-------------------------------------------");
          }