Hibernate查询特定几个字段
2016-05-20 17:18
423 查看
Hibernate查询特定几个字段
QuestionDaoImpl.java(附复合查询)
浏览器调用接口(省略)返回json结果:
发现返回的”data”对象少了属性名,只有属性值,这样不太复合要求。
QuestionDaoImpl.java(附复合查询)
接口调用(省略)json返回结果
1. 问题场景
考试系统开发中,类似考题、答题卡等对象,可能包含如“题目内容”、“答案及评语”等信息量非常大的字段,而实际使用中,列表显示不需要查询所有的对象属性,这时若把所有属性全部取出来太耗费资源,因此查询特定的几个字段就可以。2. 实现方法
说明:实现方法可能有很多,这里只列出亲测有效的两种:1.通过hql语句实现,分别获取字段数据并手动组装成对象
Question.javapackage 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(); } |
{"data":[["abc321",0,1,"多选","题目","历史"]],"code":"0","msg":"成功","size":1} |
2. 通过HQL语句new POJO()实现
Question.javapackage com.geariot.platform.exam.entities; import java.util.Date; import javax.per b937 sistence.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 + "]"; } } |
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(); } |
{"data":[{"typeName":"多选","id":"abc321","abs":"题目","level":0,"subject":"历史","type":1}],"code":"0","msg":"成功","size":1} |
相关文章推荐
- Hibernate Oracle sequence的使用技巧
- jsp Hibernate批量更新和批量删除处理代码
- jsp hibernate的分页代码第1/3页
- Struts2+Hibernate实现数据分页的方法
- Hibernate环境搭建与配置方法(Hello world配置文件版)
- JAVA+Hibernate 无限级分类
- SSH整合中 hibernate托管给Spring得到SessionFactory
- jsp hibernate 数据保存操作的原理
- hibernate中的增删改查实现代码
- 解决hibernate+mysql写入数据库乱码
- java优化hibernate性能的几点建议
- java Hibernate延迟加载
- hibernate 常用方法介绍
- 详解Java的Hibernate框架中的注解与缓存
- 浅析Java的Hibernate框架中的继承关系设计
- Hibernate实现批量添加数据的方法
- JQuery+Ajax+Struts2+Hibernate框架整合实现完整的登录注册
- 深入理解Hibernate中的flush机制
- 简要分析Java的Hibernate框架中的自定义类型
- 简单的手工hibernate程序示例