先抛出这个疑问,为什么要取几个字段,直接用实体类接受不是很方便吗?
select * from user;
可以看这个语句,假如user表只有两个字段,那没问题。如果user表有100+ 个字段呢? 我们明明只用 其中某几个,每次都取100+个字段出来,然后再用某几个,这会造成资源浪费的。 说白了,就是 select * from user;
这个语句 在阿里巴巴开发手册中明确的说了,不让用,除非你真的要取出所有的字段。
# # 那么问题来了,如何只取其中某几个呢?
如果只取其中一个,sql语句就用原生的就可以,然后比方说 我取 name 这个字段,在数据库中字段为 varchar类型。那么完全可以用 List 来接收这个返回的结果。 为什么用 List 来接受,如果你能确定你取出来的只有一条记录的话,没有关系,可以用 String 来接收。 如果数据库返回多条,你用 String 取接收,那就要报错了, more than one 异常,意思就是返回多条结果,你却用 一个String来接受。
如果你取多个字段,其实是可以用 List 来接收的,比方说你要的 sql 语句是 select name,age,sex from user
如果你加了限定条件是只能出来一条记录,用 Object 也行,如果不能保证就用List ,那么问题来了,object接收完怎么取处理呢?想当然的觉得 Object里边是List 是错的,虽然是几个不同类型的字段。你去强制类型转换是会报错的。
我试过,用 Object[ ] Object类型的数组来接收是没问题的,然后你知道里边放了几个字段,顺序是什么,然后再去强制类型转换,就可以把数据都取出来。比方说 name 是 varchar类型的,age 是 int 类型的,sex 是char类型的。 那就这样取操作Object数组。 (String)obj[0] , Integer.valueOf(obj[1]) 这样去取。 说白了我们用 Object,接收的是Object数组。
我觉得这种方案,只适合 有多个字段,支取某几个,为这几个字段去减一个实体类不太值得。
# # 如果有一百个字段,我要取 20个,这用数组去接收,有点难受了,那就用一个实体类
实体类需要包括这些 字段,提供 set get方法,然后,这样做(我说的是 JPA 的方案)
@Entity @Table(name = "article_online") public class ArticleOnlineEntity implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; private Integer app_type; private Integer article_from_id; public ArticleOnlineEntity() {} public ArticleOnlineEntity(Integer app_type, private Integer article_from_id) { 省略xxx } 省略set、getxxx }
jpa在查询时,在没有重写构造函数的时候是不能查询部分字段的,要查询实体中的部分字段,可以这样:添加一个要查询字段的构造函数。 实体ArticleOnlineEntity :
DAO写法: public interface ArticleOnlineDao extends CrudRepository { @Query( "SELECT new ArticleOnlineEntity(ao.type,ao.article_from_id) FROM ArticleOnlineEntity ao") public List findArticleIdByOnline(); } 注意点:构造函数要和查询语句中的要查询字段顺序要一样