手机端小强原创文章,java小强个人博客站点
当前位置: 首页 >> 开源 >> SpringJPA底层DAO查询的写法归类总结

SpringJPA底层DAO查询的写法归类总结

29360 开源 | 2015-7-22

如果你要使用JPA就行底层操作,那么会涉及到很多查询的代码编写,虽然JPA屏蔽了复杂代码的编写,但是还是需要我们根据业务逻辑来编写一些额外的接口代码。

这里就来归纳总结下一些查询写法的编码示例。


HQL根据参数查询所有结果:

@Query("select t from Test t where t.userId =?1")
public List<Test> findAllByUserId(String userId);

语句中“?1”代表方法传来的第一个参数,你可以写多个参数。

如果根据该参数,查询你确定只有一行记录,可以把查询这样写:

@Query("select t from Test t where t.userId =?1 and rownum < 2")

为什么这样写?因为我碰到过某程序设计本该返回一行数据,但是由于程序BUG等因素,导致出现多条数据。

所以在查询时,每次都要从数据库返回大量数据,严重影响了数据库网络性能。所以我建议,有些事情,最好多做一步。


如果想执行联合查询,然后返回一个自定义对象,此时必须传分页参数Pageable

@Query("select a.createTime as createTime,b.id as id  from Testa a,Testb b " +
		" where a.id=b.id and t.level=?1 group by a.id " +
		" order by a.createTime asc, b.createTime asc")
public Page<TempObj> searchAllByLevel(int level,Pageable pageRequest);

TempObj就有两个字段createTime和id,对应as出来的查询字段。注意这里写的仍然是HQL

如果你想直接SQL来返回对象,注意对象和返回的列必须驼峰对应上才可以。

@Query(value="select * from t_test t where t.userId = ?1 and rownum < 2",nativeQuery = true)
public List<Test> findAllByUserId(String userId);

这个示例不是联合查询,但是可以看出,我并非执行HQL而是执行SQL来查询整个表,而Test是t_test的对应类,肯定的驼峰对应的。


统计类查询

@Query("select count(t) from Test t where t.userId = ?1")
public List<Long> findCountAllByUserId(String userId);

因为这里是Count,所以List第一个索引就是要获取的统计数量值。

@Query("select count(*) from Test t where t.userId = ?1")
public BigDecimal findCountAllByUserId(String userId);

或者你可以直接返回BigDecimal,因为你知道返回的是什么,所以上层使用时,可以直接判断统计量。

if(bigDecimal != null && bigDecimal.intValue() > 0) ;

如果是SUM类的统计,可以直接返回Long:

@Query("select sum(t.price) from Test t where t.userId = ?1")
public Long findSumAllByUserId(String userId);


执行原始SQL查询

@Query(value="select t.id as id,t.game_Name as gameName from t_test t where t.userId = ?1",nativeQuery = true)
public List<Object[]> findAllByName(String userId);

编写原始SQL,然后注解查询写nativeQuery = true,返回List,List中的Object数据根据索引获取对应的值。

如果你返回就是一个值,那可以不写成数组:

@Query(value="select max(t.price) from t_test t where t.userId = ?1",nativeQuery = true)
public List<Object> findMaxByName(String userId);


以上代码能满足日常基本查询的需求,可以参考。


114b456856f.jpg

推荐您阅读更多有关于“ spring jpa Query 联合查询 HQL nativeQuery ”的文章

上一篇:ORA-12560: TNS:protocol adapter error错误 下一篇:常用SpringJPA主键生成策略,UUID和自增

猜你喜欢

发表评论:

个人资料
blogger

java小强
没有思考,人生的路会越走越难!

搜索
分类
最新微语
  • 今日北京再次沙尘暴来袭,吃了几年细粮,终于能来口粗粮了,不过大早上看见这场景,还是吓我一跳,不过随后就平静了,毕竟是老朋友了。进公司又发现一股烤糊的味道,真是祸不单行啊,例外都是污染。发了两个口罩,开启保护模式。

    2017-05-04 10:16

  • 今天同学问我,最近还在写代码吗?我想了想,这个问题怎么回答呢,我好像确实很长时间,虽然写了一些,但是主要内容已经不是写代码了。然后再想想,自己也7年多了,这么多年了,我收获了什么,我的目标到底是什么。眼看就奔三了,人生啊,开启感叹模式。

    2017-03-30 22:52

  • 也许大家都已经注意到了,今年的房价,好多地方都是翻了一番,跟着就是,各地房东开始变相涨租。今年之所以搬走,就是为此,这两天同学也是如此。很多房东只认钱,别谈感情,伤钱。而对于这个城市来说,你怎么定位自己,你真把自己当成她的一份子?你来此为何?将来何去何从?自己掂量清楚。

    2016-12-05 10:03

  • 为什么一直不写了呢?因为当爸爸了,没空了。今年的冬天,有些寒冷,除了这寒冬带来的不适,更有因乐视公司遇到危机,而带来的同事别离。送别同事,看着空旷的工位,心中有些悲凉。临近年关,此时此刻,该怎么做,似乎不再是脑子一热那么简单了。

    2016-11-24 11:28

  • 已经请假,加上国庆,要很长一段时间不在北京了。919加班,搞的现在有点心累,胸闷,身体不适。看来,我要好好休息一下了。这几天有些冷,2016的冬天,一步步来了,各位亲友,记得添衣加粗啊。

    2016-09-23 17:29

  • 更多»

最新文章
热门文章
随机文章