200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > MySQL查询多表定义实体类_SpringBoot中JPA多表联合自定义查询@Query

MySQL查询多表定义实体类_SpringBoot中JPA多表联合自定义查询@Query

时间:2019-09-23 00:05:04

相关推荐

MySQL查询多表定义实体类_SpringBoot中JPA多表联合自定义查询@Query

版权声明:本文为博主原创文章,转载请注明出处,谢谢。

其他相关文章见:个人博客站点:www.val1ant.xin

1. 实体类

本篇示例中,大致关系是一张博客文章表,一张标签表,一张博客与标签相关联表。示例代码中,均省略get、set方法及其他非必要内容

Blog.java-博客实体类,

@Entity

public class Blog {

@Id

@GeneratedValue

private Integer id;

@Lob

@Column(columnDefinition="TEXT") //匹配数据库的字段类型为text,适合长内容

}

Tag-标签实体类

@Entity

public class Tag {

@Id

@GeneratedValue

private Integer id;

private String name;

}

TagBlog-标签博客关联类

@Entity

public class TagBlog {

@Id

@GeneratedValue

private Integer id; //主键id

private Integer tagId; //标签id

private Integer blogId; //博客id

}

2. 数据库操作类

查询的任务为:联合标签博客表,统计每个标签的id、name、以及与该标签关联的博客文章数量,并且以对象集合的方式返回

1. 原生SQL查询

在复杂的查询情况下,经常会使用原生SQL语句,这个时候需要配合@Query中的nativeQuery,代码如下:

/**

* 标签博客对应表操作持久化接口

*/

public interface TagBlogRepository extends JpaRepository {

@Query(nativeQuery = true,value = "select t.id,t.name,count(tb.id) as num from tag t inner join tag_blog tb on t.id = tb.tag_id group by t.id ") //原生SQL方法

List selectAllTagView();

}

在原生的sql语句中,count聚合函数的结果类型为BigInteger,在后续中不便于处理。

注意:在原生的SQL语句中,查询的字段,表必须与数据库中对应,

2. 默认的JPQL方法

@Query(value = "select t.id,t.name,count(l.id) as n from Tag t,TagBlog l where t.id = l.tagId group by t.id") //JPQL方法

List selectAllTagView();

在上述例子中,表名直接对应的Java的对象,字段也对应于属性值,书写的时候,注意直接去原生的SQL区别。

如果是已存在对象Model,且字段属性相对应,还可以用下面的方式:

@Query(value = "select new xin.val1ant.entity.Model(x1,x2,count(x3)) from ....")

List selectAllTagView();

3. 数据处理类

为了得到特定的对象集合类,还需要对查询的结果进行处理

@Service

public class TagBlogServiceImpl implements ITagBlogService {

@Autowired

private TagBlogRepository tagBlogRepository;

@Override

public List getAllTagView() {

List views = new ArrayList<>();

List result = tagBlogRepository.selectAllTagView();

for (Object o : result) {

Object[] rowArray = (Object[]) o;

TagView view = new TagView();

view.setId((Integer) rowArray[0]);

view.setName((String) rowArray[1]);

Long count = (Long)rowArray[2];

view.setNum(count.intValue());

views.add(view);

}

return views;

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。