springboot 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再反序列化成我们想要的对象即可。

 

 

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

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

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

5933030a98441f5a0f54f80c7ec44f5e467.jpg

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

 

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

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

 

 

转载于:https://my.oschina.net/uwith/blog/3028205

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot中,我们可以使用自定义查询(Query)来实现一些特定的业务需求。自定义查询可以通过注解方式定义在Repository中,也可以在Service层中定义。下面是一个简单的示例,展示如何在Repository中定义自定义查询。 首先,我们需要在Repository接口中定义自定义查询方法。以查询用户表中性别为男性的用户为例,代码如下: ``` public interface UserRepository extends JpaRepository<User, Long> { @Query("select u from User u where u.gender = 'male'") List<User> findMaleUsers(); } ``` 在上述代码中,我们使用@Query注解来定义查询语句。查询语句中使用了JPQL语言(Java Persistence Query Language)进行定义。其中,`select u from User u`表示查询所有的User实体对象,`where u.gender = 'male'`表示查询性别为男性的用户。`findMaleUsers()`方法用于调用自定义查询,返回查询结果。 接下来,我们可以在Service层中调用自定义查询方法,实现具体的业务需求。以查询男性用户数目为例,代码如下: ``` @Service public class UserService { @Autowired private UserRepository userRepository; public int countMaleUsers() { List<User> maleUsers = userRepository.findMaleUsers(); return maleUsers.size(); } } ``` 在上述代码中,我们通过@Autowired注解将UserRepository注入到UserService中,然后调用自定义查询方法`findMaleUsers()`,得到所有性别为男性的用户。最后,返回用户数目即可。 以上就是在SpringBoot中实现自定义查询的一个简单示例。自定义查询可以使我们更加灵活地处理特定的业务需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值