Hib 4000 ernate的HQL和原生SQL返回简单对象
2016-05-08 17:25
316 查看
最近跟了一个技术经理,他有个要求就是所有的查询比结果都必需是对象,不是是map之类的,而且有很多对象的是很多实体相联合组成的对象,所有又专门研究了hibernate返回对象的知识
这次讨论的对象都是组合对象,就是很多实体相关联,取他们一部分字段的组合对象,
实体Person1
实体Card
Person1和card是一对一关系,PersonEx是这两个扩展对象
这样就动态的取到了PersonEx的集合。
这里需要注意几点
1、PersonEx里面一定要有对应的构造方法,并且sql里面参数顺序和构造器里面的顺序一致
2、PersonEx可以是没有映射关系的,也可以是实体
Dao层方法
getForListBean方法
这里需要注意的几点
1、构造函数一定要和sql里面的对应
2、oracle中默认把字段都转成大写,这样set方法就会出错,所以要转变成 as “aa” 这种
3、对于PersonEx如果有集合,怎么动态的设置进去,目前我还没找到方法
这次讨论的对象都是组合对象,就是很多实体相关联,取他们一部分字段的组合对象,
Hql
首先扩展的对象package com.hfview.bean; import java.util.ArrayList; import java.util.List; public class PersonEx { private String id; private String name; private String birthday; private String area; private List<Menu> menu = new ArrayList<Menu>(); public PersonEx(){ } public PersonEx(String name, String area) { super(); this.name = name; this.area = area; } public PersonEx(String id, String name, String birthday) { super(); this.id = id; this.name = name; this.birthday = birthday; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getBirthday() { return birthday; } public void setBirthday(String birthday) { this.birthday = birthday; } public List<Menu> getMenu() { return menu; } public void setMenu(List<Menu> menu) { this.menu = menu; } public String getArea() { return area; } public void setArea(String area) { this.area = area; } }
实体Person1
package com.hfview.bean; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; @Table(name = "t_person",schema="zhw") @Entity public class Person1 { private String id; private String name; private String sex; private Card card; @Id @Column(name="ID") public String getId() { return id; } public void setId(String id) { this.id = id; } @Column(name="NAME") public String getName() { return name; } public void setName(String name) { this.name = name; } @Column(name="SEX",columnDefinition="varchar2(8)") public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @OneToOne @JoinColumn(name="CARDID") public Card getCard() { return card; } public void setCard(Card card) { this.card = card; } }
实体Card
package com.hfview.bean; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Table(name = "t_card",schema="zhw") @Entity public class Card { private String id; private String cardId; private String area; @Id @Column(name="ID") public String getId() { return id; } public void setId(String id) { this.id = id; } @Column(name="CARDID") public String getCardId() { return cardId; } public void setCardId(String cardId) { this.cardId = cardId; } @Column(name="AREA") public String getArea() { return area; } public void setArea(String area) { this.area = area; } }
Person1和card是一对一关系,PersonEx是这两个扩展对象
public List<PersonEx> getListPersonEx1(){ String hql=" select new com.hfview.bean.PersonEx(a.name,b.area) from Person1 a left join a.card b "; return getHt().find(hql); }
这样就动态的取到了PersonEx的集合。
这里需要注意几点
1、PersonEx里面一定要有对应的构造方法,并且sql里面参数顺序和构造器里面的顺序一致
2、PersonEx可以是没有映射关系的,也可以是实体
原生SQL
类 Person2package com.hfview.bean; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.Table; @Table(name = "t_person", schema = "zhw") @Entity public class Person2 { private String id; private int age; private Date birthday; private List<Menu> menu = new ArrayList<Menu>(); @Id @Column(name="ID") public String getId() { return id; } public void setId(String id) { this.id = id; } @Column(name="AGE") public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Column(name="BIRTHDAY") public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @OneToMany @JoinColumn(name="PERSONID") public List<Menu> getMenu() { return menu; } public void setMenu(List<Menu> menu) { this.menu = menu; } }
Dao层方法
public List<PersonEx> getListPersonEx2(){ String sql="select a.id as \"id\",a.name as \"name\",to_char(a.birthday,'yyyy-mm-dd') as \"birthday\" " + "from t_person a "; return getForListBean(sql, PersonEx.class); }
getForListBean方法
public <T> List<T> getForListBean(final String sql,final Map<String,Object> paras,final int page,final int rows,final Class<T> clazz){ return ht.executeFind(new HibernateCallback<List<HashMap<String,Object>>>() { public List<HashMap<String, Object>> doInHibernate( Session session) throws HibernateException, SQLException { SQLQuery query = session.createSQLQuery(sql); if(paras!=null){ for (String key :paras.keySet()) { query.setParameter(key, paras.get(key)); } } if(page!=0&&rows!=0){ int start = page*rows-rows+1; query.setFirstResult(start).setMaxResults(rows); } query.setResultTransformer(Transformers.aliasToBean(clazz)); return query.list(); } }); }
这里需要注意的几点
1、构造函数一定要和sql里面的对应
2、oracle中默认把字段都转成大写,这样set方法就会出错,所以要转变成 as “aa” 这种
3、对于PersonEx如果有集合,怎么动态的设置进去,目前我还没找到方法
相关文章推荐
- C#清理非托管对象实例分析
- 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框架中的自定义类型