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

猜你喜欢

转载自blog.csdn.net/cheidou123/article/details/84435867
今日推荐