【Spring Data JPA】04 JPQL和原生SQL
@Transactional注解
让Spring处理事务
不需要自己每次都手动开启提交回滚
FINDONE & GETONE的区别?
findone是立即加载
getone是延迟加载,配合事务使用的
立即加载是这个方法被调用时就返回对象的值
延迟加载是在对象被调用的时候,才会执行查询来返回数值
JPQL的查询
特定查询,需要在Dao的接口方法上打上注解配置
使用JPQL的CRUD
编写测试类
@Test public void jpql(){ Customer customer = customerDao.getCustomerByCustName("播客"); System.out.println(customer); }
按客户名称和客户ID查询名称
接口的声明
@Query(value = "from cn.dai.entity.Customer where custId = ? and custName = ?") public Customer getCustomerByCustIdAndCustName(Long custId,String custName);
测试类
@Test public void jpql2(){ Customer customer = customerDao.getCustomerByCustIdAndCustName(3l, "传智播客"); System.out.println(customer); }
结果
【注意JPQL语句的占位符顺序,声明的参数要按顺序对应才行】
或者按照新版本的占位符风格这样声明
就是显示的声明这个占位符对应的是第几个参数
按ID更新客户名称
接口声明:
@Modifying @Query("update cn.dai.entity.Customer set custName = ?2 where custId = ?1") public long updateCustomerByCustId(Long custId,String custName);
测试类
@Test public void jpql2(){ Customer customer = customerDao.getCustomerByCustIdAndCustName(3l, "传智播客"); System.out.println(customer); }
结果会这样报错
在之前的查询是不会数据库起修改作用,所以要不要事务都无所谓
但是这个JPQL是一个增删改的执行,JPA事务会强制要求事务存在,否则就会报这个事务要求异常
执行的是修改或者删除查询
解决:
在我们的测试方法上打上事务注解,【在业务层的业务方法打】
然后测试才通过了
但是数据库并没有修改,因为事务没有提交?
设置是否自动回滚【默认是自动回滚。。。】
再次执行,修改成功
使用SQL书写
测试类
结果
另外,除了实体类之外还可以使用这种Object数组的形式接收
忘了忘了,要用工具类打印
可以了
条件查询也是一样,区别不大,不需要做演示了