1、需求
我的需求是统计域名以及域名出现的次数。

之前使用springboot jpa都是把数据库中的表跟实体类绑定,创建继承JpaRepository的接口。如下:
@Repository
public interface UrlsRepository extends JpaRepository<Urls, String> {
Optional<Urls> findById(Integer id);
}
但是对于这种查询却无法绑定到原有的实体类。那么改怎么解决这种需求呢?
2、解决方法
用一个包装类来接收查询结果,根据类的构造方法实现字段映射
@Getter
@Setter
@ToString
public class DomainVo {
private String domain;
private Long visitCount;
public DomainVo(String domain, Long visitCount) {
this.domain = domain;
this.visitCount = visitCount;
}
}
repository写法
/*
注意:
1、使用的是全类名
2、查询的表对应的是已经绑定的实体类Urls
3、nativeQuery设为false,表示使用的是jpql语言。
*/
@Query(value = "SELECT new com.ununie.chromehistory.model.vo.DomainVo(u.domain,sum(u.visitCount)) from Urls u GROUP BY u.domain ORDER BY sum(u.visitCount) desc")
List<DomainVo> findDomainCount();
测试:
@Test
public void findDomainCount() {
List<DomainVo> domainCount = urlsRepository.findDomainCount();
for (DomainVo vo : domainCount) {
System.out.println(vo);
}
}
本文介绍了如何在SpringBoot中使用JPA进行复杂查询,特别是当查询结果不直接映射到实体类时的处理方法。通过创建一个包装类`DomainVo`,并利用`@Query`注解配合构造方法实现字段映射,成功实现了对`Urls`表的统计查询,得到每个域名及其出现次数。测试结果显示查询功能正常工作。
2645

被折叠的 条评论
为什么被折叠?



