hibernate-JPA分类统计

这个总能用到  我又一直是照葫芦画瓢 没明白精髓 路过的大神可以讲讲

贴几个工程中的例子

@Query(value = "SELECT  new com.trs.netInsight.widget.analysis.entity.ClassInfo(i.userId, COUNT(*)) FROM IndexTabMapper i WHERE i.organizationId = (:orgId) AND i.share=TRUE AND i.isMe=TRUE GROUP BY i.userId")
	public List<ClassInfo> computeCountByOrgIdGroupByUserId(@Param(value = "orgId") String orgId);

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

@Query(value = "select `special_name`, `compute_time`,"
			+ " `hot_degree` AS `hot_degree`, `netizen_degree` AS `netizen_degree`,"
			+ " `meta_degree` AS `meta_degree`" 
			+ " FROM `special_exponent`"
			+ " WHERE `special_id` = (:specialId)" 
			+ " AND (`compute_time` BETWEEN (:begin) AND (:end))"
			+ " ORDER BY `compute_time` ASC;", nativeQuery = true)
	public List<Object[]> computeExponentGroupbyTime(@Param(value = "specialId") String specialId,
			@Param(value = "begin") Date begin, @Param(value = "end") Date end);
@Query(value = "SELECT type FROM HaiguanPinzhong WHERE userId = (:userId) GROUP BY type")
	public List<String> pinzhongGroupbyPinzhong(@Param(value = "userId") String userId);

看了这个博客好像有点开窍了  @Query中的sql大概就是正常的sql中用实体名代替表明  用实体中属性代替表中字段 用(:参数)或者?序号代替入参

Srping框架中使用@query注解实现复杂查询 - 涤新云 - 博客园

在Spring框架中,关于从数据表获取数据有不同的方法,当数据查询比较简单时,可以通过继承JpaRepository<T, L> 使用findBy***方法,通过分析方法名来实现查询,T表示要查询的数据表所对应的实体,L表示该实体主键的类型,比如Long。关于findBy方法如何通过分析方法名来实现查询,网上资料很多,不做赘述。 
    如果查询的数据比较复杂,查询条件比较复杂时,可以考虑使用JPA的@query方法来实现查询。关于使用方法,下面做简单介绍: 

1.首先Dao层需继承Repository<T, L>,T为实体名,L为该实体的主键类型。 
2.写查询方法,并使用@query进行注解,例如: 
@query(select u from User u where name=?1 and age=?2)
List findUser(String name,int age);
在这里,User为实体名,参数中的name值在执行时可以赋值给?1的位置。 
但是,事实上,如果只是从一个数据表中获取数据,使用上面所说的findBy**方法即可,并不需要使用@query来实现。 
但是,当查询条件比较复杂,无法使用findBy方法时,就可以考虑使用@query.先给出一个例子: 
@Query("select max(jobinfo.processes) from Jobinfo jobinfo,Taskinfo taskinfo where taskinfo.jobid=jobinfo.id and (shenweistatus=4 or shenweistatus=5) and queuename=?1")
List findMaxNuclear(String queuename);

通过这条语句,可以看到其涉及到两个实体,查询的是max,用Findby是无法实现的,但是这个例子就可以很好的实现。而关于1中的T就没有多大意义,应该是随便写语句中涉及到的一个实体即可。 
关于其他的复杂查询都可以通过这种方法实现。 
再看下面这个例子: 
@Query("select jobinfo.queuename from Jobinfo jobinfo,Taskinfo taskinfo where taskinfo.jobid=jobinfo.id and (shenweistatus=1 or shenweistatus=3) and jobinfo.queuename like ?1 group by jobinfo.queuename")
List findQueuenameByName(String name);

里边涉及到了模糊查询,在SQL中,模糊查询应该是 like ‘%AA%’等形式的,但是这里的注解中如果加入了%,会报错,怎么解决呢?可以在调用该方法是人为的将%传进去,比如findQueuenameByName(“%”+name+”%”),这样就可以实现模糊查询。 
需要注意的是,我测试发现,这种方法只能查询一个字段,如果要查询多个字段,只能写多个方法,得到多个list,最后将查询结果拼到一块。(至于到底能不能一次查询多个字段,正在探索中。。。。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值