jpa高階註解
阿新 • • 發佈:2018-11-28
本文為轉載部落格
博主原創文章: 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);
@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("-------------------------------------------");
}