spring data jpa如何只查询实体部分字段

网友投稿 278 2023-01-08

spring data jpa如何只查询实体部分字段

需求

现在有一张article表,用来储存文章,对应的实体类如下:

package com.qianyucc.blog.model;

import lombok.*;

import javax.persistence.*;

/**

* @author lijing

* @date 2019-08-05 14:28

* @description 文章

*/

@Data

@Entity

@Table(name = "article")

public class Article {

@Id

// 主键自增

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Long id;

@Column(name = "author",unique = false,nullable = false,length = 20)

private String author;

@Column(name = "title",length = 100)

private String title;

@Column(name = "content",columnDefinition = "clob not null")

private String content;

@Column(name = "tags",length = 50)

private String tags;

@Column(name = "type")

ObtoypZkM private Integer type;

@Column(name = "categories",length = 50)

private String categories;

@Column(name = "gmt_create")

private Long gmtCreate;

@Column(name = "gmt_update")

private Long gmtUpdate;

@Column(name = "tabloid")

private String tabloid;

@Column(name = "likes")

private Integer likes;

@Column(name = "views")

private Integer views;

}

现在需要查询文章的所有分类,也就是categories属性

解决方法

网上的一些方法分别是重写构造器、或者自定义接口作为返回类型,但是我试了后都不能很好的解决问题。下面提供一种方法,亲测可以实现上面的需求。

一个字段的情况

Controler:

package com.qianyucc.blog.controller;

/**

* @author lijing

* @date 2019-08-05 15:13

* @description

*/

@RestController

public class ArticleController {

@Autowired

private ArticleRepositoryarticleRepository;

@GetMapping("/getAllCategories")

public Object getAllCategories(){

return articleRepository.getAllCategories();

}

}

Repository:(这里省略Service层)

package com.qianyucc.blog.repository;

import com.qianyucc.blog.model.*;

import org.springframework.data.jpa.repository.*;

import java.util.*;

/**

* @author lijing

* @date 2019-08-05 14:28

* @description 文章数据库访问层

*/

public interface ArticleRepository extends JpaRepository

,JpaSpecificationExecutor

@Query(value = "select distinct categories from article",nativeQuery = true)

// 这里注意返回值用String类型接收

List findAllCategories();

}

上面的nativeQuery属性设置为true的时候可以使用SQL语句。

测试结果:

控制台打印:

多个字段的情况

只需修改Repository,注意现在的返回值为List>

public interface ArticleRepository extends JpaRepository

,JpaSpecificationExecutor
{

@Query(value = "select author,categories from article",nativeQuery = true)

List&ObtoypZkMlt;Map> findAllCategories();

}

测试结果

控制台打印

JPA查询部分字段的相关事项

JPA使用HQL查询部分字段出错:

org.hibernate.hql.internal.ast.QuerySyntaxException: XXX is not mapped

解决:

应该@Entity指定name名,name值为对应表名,同@Table的name值相同

使用HQL的注意:

1.想要使用JPA查询部分信息,需要使用HQL

2.select需跟实体,可以是map(必须是小写,大写试了下报错),或者是将待查询的字段单独封装成一个实体,new 实体

3.查询的字段中需要指定as别名,否则得到的map结果集中,key值默认是"0",“1”,“2”…数字

@Query(value = "select distinct categories from article",nativeQuery = true)

// 这里注意返回值用String类型接收

List findAllCategories();

}

上面的nativeQuery属性设置为true的时候可以使用SQL语句。

测试结果:

控制台打印:

多个字段的情况

只需修改Repository,注意现在的返回值为List>

public interface ArticleRepository extends JpaRepository

,JpaSpecificationExecutor
{

@Query(value = "select author,categories from article",nativeQuery = true)

List&ObtoypZkMlt;Map> findAllCategories();

}

测试结果

控制台打印

JPA查询部分字段的相关事项

JPA使用HQL查询部分字段出错:

org.hibernate.hql.internal.ast.QuerySyntaxException: XXX is not mapped

解决:

应该@Entity指定name名,name值为对应表名,同@Table的name值相同

使用HQL的注意:

1.想要使用JPA查询部分信息,需要使用HQL

2.select需跟实体,可以是map(必须是小写,大写试了下报错),或者是将待查询的字段单独封装成一个实体,new 实体

3.查询的字段中需要指定as别名,否则得到的map结果集中,key值默认是"0",“1”,“2”…数字

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:详解Java中的锁Lock和synchronized
下一篇:API接口网站源码分享(api开源)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~