Hibernate查询特定几个字段
来源:互联网 发布:淘宝接单的app都有哪些 编辑:程序博客网 时间:2024/06/09 16:32
Hibernate查询特定几个字段
1. 问题场景
考试系统开发中,类似考题、答题卡等对象,可能包含如“题目内容”、“答案及评语”等信息量非常大的字段,而实际使用中,列表显示不需要查询所有的对象属性,这时若把所有属性全部取出来太耗费资源,因此查询特定的几个字段就可以。
2. 实现方法
说明:实现方法可能有很多,这里只列出亲测有效的两种:
1.通过hql语句实现,分别获取字段数据并手动组装成对象
Question.java
package com.geariot.platform.exam.entities;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="question")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region="javaClassName")
public class Question {
private String id;
private int level; //难度
private int type; //类别,单选题0,多选题1,填空题2,问答题3
private String typeName; //类别名称
private String abs;//题目缩略内容
private String content;//题目内容
private String subject;//科目名称
private String subjectId;//科目Id
private Date createTime;//创建时间
private String answer; //标准答案
@Id
@Column(length=32)
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid", strategy="uuid")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Column(name = "type_name")
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
@Column(name = "subject_id")
public String getSubjectId() {
return subjectId;
}
public void setSubjectId(String subjectId) {
this.subjectId = subjectId;
}
@Column(name = "create_time")
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer;
}
public String getAbs() {
return abs;
}
public void setAbs(String abs) {
this.abs = abs;
}
@Override
public String toString() {
return "Question [id=" + id + ", level=" + level + ", type=" + type
+ ", typeName=" + typeName + ", abs=" + abs + ", content="
+ content + ", subject=" + subject + ", subjectId=" + subjectId
+ ", createTime=" + createTime + ", answer=" + answer + "]";
}
}
QuestionDaoImpl.java(附复合查询)
public List<Question> getQuestions(Question q, int start, int number) {
StringBuffer basicQueryStr ;
basicQueryStr = new StringBuffer("select id, level, type, typeName, abs, subject from Question");
QuestionAndQueryCreator creator = new QuestionAndQueryCreator(q);
String creatorStr = creator.createStatement();
Query query = QueryUtils.createLocalQuery(getSession(),basicQueryStr, creatorStr,ORDER_CON.DESC_ORDER);
query.setCacheable(true);
query.setFirstResult(start);//设置起始行
query.setMaxResults(number);//每页条数
List<Question> list = new ArrayList<Question>();
List<Object[]> resultList = query.list();
for(Object[] obj:resultList)
{
Question que = new Question();
que.setId((String)obj[0]);
que.setLevel((int)obj[1]);
que.setType((int)obj[2]);
que.setTypeName((String)obj[3]);
que.setAbs((String)obj[4]);
que.setSubject((String)obj[5]);
list.add(que);
}
return query.list();
}
浏览器调用接口(省略)返回json结果:
{"data":[["abc321",0,1,"多选","题目","历史"]],"code":"0","msg":"成功","size":1}
发现返回的”data”对象少了属性名,只有属性值,这样不太复合要求。
2. 通过HQL语句new POJO()实现
Question.java
package com.geariot.platform.exam.entities;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="question")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region="javaClassName")
public class Question {
//因为"select new Question(id, level, type, typeName, abs, subject) from Question"
//所以必须创建带有待查询参数的构造方法和空的构造方法
public Question(String id, int level, int type, String typeName,
String abs, String subject) {
this.id = id;
this.level = level;
this.type = type;
this.typeName = typeName;
this.abs = abs;
this.subject = subject;
}
public Question()
{
}
private String id;
private int level; //难度
private int type; //类别,单选题0,多选题1,填空题2,问答题3
private String typeName; //类别名称
private String abs;//题目缩略内容
private String content;//题目内容
private String subject;//科目名称
private String subjectId;//科目Id
private Date createTime;//创建时间
private String answer; //标准答案
@Id
@Column(length=32)
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid", strategy="uuid")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Column(name = "type_name")
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
@Column(name = "subject_id")
public String getSubjectId() {
return subjectId;
}
public void setSubjectId(String subjectId) {
this.subjectId = subjectId;
}
@Column(name = "create_time")
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer;
}
public String getAbs() {
return abs;
}
public void setAbs(String abs) {
this.abs = abs;
}
@Override
public String toString() {
return "Question [id=" + id + ", level=" + level + ", type=" + type
+ ", typeName=" + typeName + ", abs=" + abs + ", content="
+ content + ", subject=" + subject + ", subjectId=" + subjectId
+ ", createTime=" + createTime + ", answer=" + answer + "]";
}
}
QuestionDaoImpl.java(附复合查询)
public List<Question> getQuestions(Question q, int start, int number) {
StringBuffer basicQueryStr ;
basicQueryStr = new StringBuffer("select new Question(id, level, type, typeName, abs, subject) from Question");
QuestionAndQueryCreator creator = new QuestionAndQueryCreator(q);
String creatorStr = creator.createStatement();
Query query = QueryUtils.createLocalQuery(getSession(),basicQueryStr, creatorStr,ORDER_CON.DESC_ORDER);
query.setCacheable(true);
query.setFirstResult(start);//设置起始行
query.setMaxResults(number);//每页条数
return query.list();
}
接口调用(省略)json返回结果
{"data":[{"typeName":"多选","id":"abc321","abs":"题目","level":0,"subject":"历史","type":1}],"code":"0","msg":"成功","size":1}
- Hibernate查询特定几个字段
- Hibernate Criteria可以只查询出表中几个字段
- hibernate查询表的几个字段遍历数据
- hibernate进行多表查询每个表中各取几个字段
- sphinx 特定字段的查询
- Rails 选择特定字段查询
- Hibernate查询对象所有字段,单个字段 ,几个字段取值的问题
- Hibernate查询对象所有字段,单个字段 ,几个字段取值的问题
- Hibernate查询对象所有字段,单个字段 ,几个字段取值
- Hibernate查询对象所有字段,单个字段 ,几个字段取值的问题
- hibernate查询部分字段
- Hibernate - 查询部分字段
- hibernate查询部分字段
- spring entityManager 查询特定字段内容
- hibernate 只查询某个字段
- hibernate查询指定字段示例
- hibernate criteria 查找特定表中的distinct字段
- 根据特定字段和注释查询表清单
- FragmentTransaction add 和 replace 区别
- iOS应用架构谈 开篇
- 今天上qq空间看到一个有意思的东西,类似射线的效果
- XenServer存储库SR损坏的数据恢复方案
- 云计算的一些总结知识
- Hibernate查询特定几个字段
- android webview 输入法软键盘遮挡输入框实现(界面自动上滑并可滑动)
- 深度学习随手笔记
- git 查看远程分支、本地分支、创建分支、把分支推到远程repository、删除本地分支
- FFmpeg Filtering Guide
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- js代码延迟一定时间后执行一个函数
- 加速Android Studio/Gradle构建
- 深入Java集合学习系列:ArrayList的实现原理