spring boot jpa之 流式查询 @Query定义查询方法

按照方法名来定义查询方法的形式,只适用于单表的一两个字段,那种复杂的查询,还要自己写sql语句,也就是@Query定义查询方法

@Query(value=" 这里就是查询语句")

@Query支持hql和原生sql两种方式,默认是hql  ,hql就是语句中用的是实体名字和实体属性,原生sql用的表名字和表字段, 

方法名字这里可以自己定义

1、hql方式

注意 hql 方式不支持 select *        要想查询全部字段可以用 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);
}

 @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);
}

 如果是更新或者删除操作,方法上面要加@Modifying      默认开启的事务只是可读的,更新操作加入@Modifying 就会关闭可读

@Modifying
@Query("update User u set u.firstname = ?1 where u.lastname = ?2")
int setFixedFirstnameFor(String firstname, String lastname);

 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);

hql排序  这种方式不支持同时排序和分页

@Query(value = "select u from  User u")
List<User> findUserLikeBySort(Sort sort);

 排序  直接使用 order by

@Query("select e from ECardEntity e ORDER BY e.seqNum ASC")
Page<ECardEntity> findInOrders(Pageable pageable);

 分页里加入排序

Sort sort = new Sort(Direction.ASC, "seqNum");
Pageable pageable = new PageRequest(pageNum, size, sort);

多字段排序

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);
   

 

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、原生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即可

 

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值