本文为转载博客
博主原创文章: 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("-------------------------------------------"); }