很多情况下,我们并不想把所有属性返回给,需要返回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,所以必须字段名称一一对应!!)