JPA使用之实体类返回DTO类,Query注解的用法

本文介绍如何使用JPA的Query注解实现复杂查询,并通过原生SQL返回DTO类实例,适用于需要灵活定制返回数据结构的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多情况下,我们并不想把所有属性返回给,需要返回Dto类,属性不对应,这个时候继承原生Reposity就不能满足我们的需求。这个时候可以使用Query注解。

首先先说一下我的两个表
表1,main表

@Data
public class ArticleMain implements Serializable {

    @Id
    @Protect
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(columnDefinition="varchar(32) COMMENT '连接主表的article_id'")
    private String articleId;

    @Column(columnDefinition="varchar(32) COMMENT '作者用户open id'")
    private String openId;
    }

表2 子表sub

public class ArticleSub {

    @Id
    @Protect
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;


    @Column(columnDefinition="varchar(32) COMMENT '连接主表的article_id'")
    private String articleId;

    @Column(columnDefinition="varchar(32) COMMENT '最后回复人open id'")
    private String lastCommentUserId;
    }

使用Query,JPA的sql

我的reposity是这样的

public interface ArticleMainRepository extends JpaRepository<ArticleMain, Long> {

    @Query("select a from ArticleMain a inner join  ArticleSub s on a.articleId = s.articleId where a.articleId = ?1")
    ArticleMain getArticleById(@Param("articleId") String articleId);

这一种最省心,ArticleMain 什么的就是你的类名,字段什么也会提示,?1代表第一个传入参数。

使用原生sql

public interface ArticleMainRepository extends JpaRepository<ArticleMain, Long> {

    @Query(value = "select * from article_main a where a.article_id=?1",nativeQuery = true)
    ArticleMain getArticle(@Param("articleId") String articleId);

如果要用sql原生语句,那么里面的语句就需要保证在sql中也可以正常使用,并且加上字段,使用nativeQuery = true。

返回Dto类

我的dto类

@Data
public class ArticleDto {

    private String articleId;

    private String openId;
    public ArticleDto(String articleId,String openId) {
        this.articleId = articleId;
        this.openId = openId;
    }
}
   

返回DTo的时候,一定要保证dto类,所有的变量都要进行构造函数!!且getset方法都已经设置
这是我的repository

public interface ArticleMainRepository extends JpaRepository<ArticleMain, Long> {
   @Query("select new com.forum.api.model.dto.ArticleDto(a.openId,a.articleId) from ArticleMain a inner join  ArticleSub s on a.articleId = s.articleId where a.articleId = ?1")
    ArticleDto getArticleDtoAll(@Param("articleId") String articleId);

这种方法类似于使用JPA的sql,new一个dto类,然后括号里面放上你想放进去的字段值(DTo的构造函数有多少,你就要放多少。如果你的dto有三个参数,构造函数两个参数,那么在query里面就要放两个参数,因为用的query的sql,所以必须字段名称一一对应!!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值