Springboot JPA如何使用distinct返回对象

 更新时间:2022年02月23日 11:47:04   作者:小石潭记丶  
这篇文章主要介绍了Springboot JPA如何使用distinct返回对象,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

JPA如何使用distinct返回对象

package com.frank.jpaBatchSave.repository;
import com.frank.jpaBatchSave.entity.Person;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
 
@Repository
public interface PersonRepository extends PagingAndSortingRepository<Person, Integer> {
 
    @Query("select distinct new Person(p.name, p.province, p.city) from Person p")
    List<Person> getAllPerson();
}

这里如果需要返回的是对象,则需要new Person(p.name, p.province, p.city),同时Person类必须要有三参的构造器。

public Person(String name, String province, String city) {
        this.name = name;
        this.province = province;
        this.city = city;
    }

因为:select distinct name, province, city) from Person p 这样写的话返回的是Object[]数组。所以需要使用上面的方式。

JPA自定义返回对象

任何ORM框架都少不了开放自定义sql的问题。jpa自然也不例外,很多场景需要写复杂sql的。

首先定义一个方法签名,然后打上@Query注解。像下面这样,需要注意nativeQuery,这个表示query中的字符以原始的sql语句执行,也就是不做任何调整。你写啥,就执行啥sql语句。但是想返回自定义的实体,Sorry,做不到。的用另一种方式。

@Query(value = "SELECT * from table where id= :id", nativeQuery = true)
List<aa> getByaaId(@Param("id") BigInteger id);

方法一

下面这个就是实现自定义的实体方法。首先需要定义个实体,这个实体必须包含无参和全参构造函数。然后去掉nativeQuery,同时还有一点必须注意,写的语句里面不是数据库中对应的实际表名,而是你定义的实体映射。比如下面的table1和table2,其实都是你定义的实体类的名字,不是你的数据库表名,是你代码中映射数据表的实体类名。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class aaDto {
    private String aa;
    private String bb;
    private String cc;
}
@Query(value = "SELECT new com.xxx.xxx.dto.aaDto(i.aa,i.bb,i.cc) FROM table1 i JOIN table2 e on i.id=e.id")
List<aaDto> getList();

方法二

方法一这种写法还是非常不灵活,有时候写一些函数什么的,估计会搞死,还是得写原生的sql才行。我说的查询字段属于多个表。如果只查询一个表字段,关联查询只是条件,可以直接返回对应的实体也是没问题的。

List<Map<String, Object>>
@Query(value = "SELECT a.aa,b.bb from a LEFT JOIN b a.id=b.id", nativeQuery = true)
List<Map<String, String>> getFundAccountList();

这样返回的数据就是一个集合,是键值型的,如果我们实在想用对象,不用Map,我是先把返回参数序列化成json,然后将这个json再反序列化成我们想要的对象即可。

方法三

在继承jpa接口的时候,里面的实体类写你的对应结果类,就可以用相应的结果来接收了。

public interface xxxDTORepository extends JpaRepository<xxxDTO, Long>

方法四

以上的方法都是基于继承JpaRepository接口来实现,其实又另外一种更加灵活的方式,这种方式可以更加灵活的写sql和定义返回对象。

@PersistenceContext
private EntityManager entityManager;

记录一个错误:Path expected for join!

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join!

就这么个错误,其实很简单,只是我没有细看错误信息,导致在正确的语句找错误,找不到。出现这个错误,后面会跟你写的hql语句,注意留意这个hql语句,仔细检查,他一定是有错误的。

有个博客说需要添加映射关系,其实完全不用的,就是一对多,A类里面包含List<B> 是不需要这样的,独立类没任何关联也是可以的,细心细心细心。。。

顺带再来记录一个问题吧,这个问题简单,出现下面这段代码,后面会跟一些信息,根据信息就可以知道是返回对象的构造函数类型问题,既然这样,那就调整下返回实体对象的属性类型即可。

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate appropriate constructor on class

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • JAVA利用递归删除文件代码实例

    JAVA利用递归删除文件代码实例

    这篇文章主要介绍了JAVA利用递归删除文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java 获取泛型的类型实例详解

    Java 获取泛型的类型实例详解

    这篇文章主要介绍了Java 获取泛型的类型实现代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • java常见的字符串拼接方式总结

    java常见的字符串拼接方式总结

    这篇文章主要为大家详细介绍了java中常见的字符串拼接方式,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-09-09
  • SpringCache缓存处理详解

    SpringCache缓存处理详解

    这篇文章主要介绍了SpringCache缓存处理详解,SpringCache是一个框架,实现了基于注解缓存功能,只需要简单地加一个注解,就能实现缓存功能,需要的朋友可以参考下
    2023-09-09
  • SpringCloud Nacos配置中心管理超详细讲解

    SpringCloud Nacos配置中心管理超详细讲解

    这篇文章主要介绍了Springcloud中的Nacos服务配置,本文以用户微服务为例,进行统一的配置,结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • Idea中maven项目实现登录验证码功能

    Idea中maven项目实现登录验证码功能

    这篇文章主要介绍了Idea中maven项目实现登录验证码功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Spring系列中的beanFactory与ApplicationContext

    Spring系列中的beanFactory与ApplicationContext

    这篇文章主要介绍了Spring系列中的beanFactory与ApplicationContext,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 解析Java和IDEA中的文件打包问题

    解析Java和IDEA中的文件打包问题

    这篇文章主要介绍了Java和IDEA中的文件打包问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • mybatis中实现让返回值与bean中字段相匹配

    mybatis中实现让返回值与bean中字段相匹配

    这篇文章主要介绍了mybatis中实现让返回值与bean中字段相匹配,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Jackson自定义序列化反序列化注解加解密字段详解

    Jackson自定义序列化反序列化注解加解密字段详解

    这篇文章主要介绍了Jackson自定义序列化反序列化注解加解密字段详解,一些场景中,数据库字段用于存储json格式数据,处于安全的考虑,该json数据中,某些敏感信息字段需要做加密存储,例如身份证号、手机号等,需要的朋友可以参考下
    2023-11-11

最新评论