一.概述
@Query定义查询方法;
以下是:@Query和@Param的类路径
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
@Query(value=" 这里就是查询语句")
@Query支持hql和原生sql两种方式,默认是hql
1.1 hql就是语句中用的是实体名字和实体属性;
1.2 原生sql用的表名字和表字段,
1.3 方法名字这里可以自己定义;
二.使用方式
2.1 hql方式
注意 hql 方式不支持 select *
2.1.1 位置方式
要想查询全部字段可以用 sellect 实体名 这里省略了value ,参数使用了占位置符 ?1 代表第一个参数 ?2代表第二个
public interface UserRepository extends JpaRepository<User, Long> {
@Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);
}
2.1.2 占位符方式
@Param 代替参数占位符
hql或者sql里就用 :firstname替换
方法里的参数顺序可以打乱
@Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname")
User findByLastnameOrFirstname(@Param("lastname") String lastname,
@Param("firstname") String firstname);
}
2.1.3 修改和删除
方法上面要加@Modifying 默认开启的事务只是可读的,更新操作加入@Modifying 就会关闭可读
@Modifying
@Query("update User u set u.firstname = ?1 where u.lastname = ?2")
int setFixedFirstnameFor(String firstname, String lastname);
2.1.4 hql分页
返回的page 里面包含了总页数 当前页 pageSize等信息 , pageable调用的时候 传入PageRequest pageRequest = new PageRequest(pageNo,pageSize); 即可
@Query(value = "select u from User u where u.name like %?1% ")
Page<User> findUserLikeByPage(String name, Pageable page);
//返回值或者用list Page里包含了总条数 当前页数等分页信息 list就是数据 不包含分页信息
@Query(value = "select u from User u where u.name like %?1% ")
list<User> findUserLikeByPage(String name, Pageable page);
2.1.5 hql排序 这种方式不支持同时排序和分页
@Query(value = "select u from User u")
List<User> findUserLikeBySort(Sort sort);
2.1.6 排序 直接使用 order by
@Query("select e from ECardEntity e ORDER BY e.seqNum ASC")
Page<ECardEntity> findInOrders(Pageable pageable);
2.1.7 分页里加入排序
Sort sort = new Sort(Direction.ASC, "seqNum");
Pageable pageable = new PageRequest(pageNum, size, sort);
2.1.8 多字段排序
Sort sort = new Sort(Sort.Direction.DESC, "name").and(new Sort(Sort.Direction.ASC, "rangeMileage"));
//按线路降序和里程升序排序
Order nameOrder = new Order(Direction.DESC, "sname");
Order rangeOrder = new Order(Direction.ASC, "rangeMileage");
List<Order> orders = new ArrayList<Order>();
orders.add(nameOrder);//先按线路降序
orders.add(rangeOrder);//再按里程升序
Sort sort2 = new Sort(orders);
Pageable pageable = new PageRequest(pageNum, size, sort2);
2.1.9 hql 模糊查询 这里的%%不用单引号,原生的sql需要单引号 例如 '%张三%'
@Query(value = "select u from SysUser u where u.username like %:skey% or u.nickname = %:skey%",
countQuery = "select count(u) from SysUser u where u.username like %:skey% or u.nickname = %:skey%")
Page<SysUser> pageQuery(@Param("skey") String skey, Pageable pageable);
2.2 原生sql方式
原生sql方式 不能和Pageable pageable 同时使用,要用自己的limit实现分页,原生的方式就和sql语法完全一样,使用的表名字 表字段
//nativeQuery = true 就代表使用原始 sql 原始sql支持select * 方法名字可以自定义
@Query(value = "select * from book b where b.name=?1", nativeQuery = true)
List<Book> findByName(String name);
使用分页 limit start , length 开始位置,长度
模糊查询 like '%:descripe%' 会出现无法识别descripe 所以要写成 like CONCAT('%',:descripe,'%')
判断 if(表达式1,表达式2,表达式3) 如果1成立1 就采取2 否则采取3 \"\" 转义字符代表空字符串
@Query(value="select * from table_management r where r.table_attribute = :tableAttribute and r.descripe like CONCAT('%',:descripe,'%') and if(\"\" = :dbName,1=1,r.db_name = :dbName) and if(\"\" = :tableName,1=1,r.table_name = :tableName) limit :start, :len ",nativeQuery=true)
public List<TableManagement> findTableManagement(@Param("tableAttribute") Integer tableAttribute,@Param("dbName") String dbName,@Param("tableName") String tableName,@Param("descripe") String descripe,@Param("start") Integer start,@Param("len") Integer len);
排序,就直接使用order by即可