1. 程式人生 > >JPA 基礎(二)

JPA 基礎(二)

一、@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("-------------------------------------------");
}