jpa 使用原生sql 总结

2022-09-08 10:55:23

SQL 使用的是@Query注解,进行编写查询,修改,删除,增加的sql

在**删除和修改,增加方法需要有@Modifying**注解.也可以根据需要添加@Transactional对事物的支持,查询超时的设置等

@Modifying
@Query("update User u set u.userName = ?1 where u.id = ?2")
int modifyByIdAndUserId(String  userName, Long id);
	
@Transactional
@Modifying
@Query("delete from User where id = ?1")
void deleteByUserId(Long id);
  
@Transactional(timeout = 10)
@Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);

传参方式

下表索引传参
@Query ( "select u from t_user u where id>?1 and username like ?2" )
List <User > selectUserByParam ( Long id , String name );

@param 命名参数传参
@Query ( "select u from t_user u where id>:id and username like :name" )
List <User > selectUserByParam ( @param('id') Long id ,  @param('name') String name );

使用原生的SQL查询

@Query(value="select * from t_user", nativeQuery=true)
List <User > selectAll()

有nativeQuery = true时,是可以执行原生sql语句,所谓原生sql,也就是说这段sql拷贝到数据库中,然后把参数值给一下就能运行了

nativeQuery = false时,就不是原生sql,而其中的select * from 的xxx中xxx也不是数据库对应的真正的表名,而是对应的实体名,并且sql中的字段名也不是数据库中真正的字段名,而是实体的字段名。

【推荐】自定义接收指定sql的接口对象,这种方式能够根据需要查询需要展示的字段。
package gds.health.domain;
/**
 * 此接口中可以定义多于和接收参数有关的get Methond
 */
public interface UserPoint {
    String getUserId();
    String getUserName();
    String getEmail();
    String getClassName();
    Integer getUPoints();
}

 // 使用定义接口方式实现原生sql 的数据获取
    @Query(value="select u.id userId, u.login userName, sum(p.meals + p.alcohol + p.excercise) uPoints  from Points p, jhi_user u where p.user_id=u.login group by u.id", nativeQuery=true)
    List<UserPoint> findUserPoint();

注意:

  1. 可以通过自定义的 JPQL 完成 UPDATE 和 DELETE, INSERT操作
  2. 方法的返回值应该是 int,表示更新语句所影响的行数
  3. 在调用的地方必须加事务,没有事务不能正常执行
  4. 默认情况下, Spring Data 的每个方法上有事务, 但都是一个只读事务. 他们不能完成修改操作
  • 作者:溪岚画
  • 原文链接:https://blog.csdn.net/qq_32719215/article/details/100113197
    更新时间:2022-09-08 10:55:23