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("-------------------------------------------");
          }
          
                  
                  
      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包
      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

      余额充值