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();
注意:
- 可以通过自定义的 JPQL 完成 UPDATE 和 DELETE, INSERT操作
- 方法的返回值应该是 int,表示更新语句所影响的行数
- 在调用的地方必须加事务,没有事务不能正常执行
- 默认情况下, Spring Data 的每个方法上有事务, 但都是一个只读事务. 他们不能完成修改操作