Hibernate的HQL和原生SQL返回简单对象

最近跟了一个技术经理,他有个要求就是所有的查询比结果都必需是对象,不是是map之类的,而且有很多对象的是很多实体相联合组成的对象,所有又专门研究了hibernate返回对象的知识

这次讨论的对象都是组合对象,就是很多实体相关联,取他们一部分字段的组合对象,

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

类 Person2

package 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如果有集合,怎么动态的设置进去,目前我还没找到方法

时间: 2024-10-27 02:27:24

Hibernate的HQL和原生SQL返回简单对象的相关文章

jpa 联表查询 返回自定义对象 hql语法 原生sql 语法 1.11.9版本

-----业务场景中经常涉及到联查,jpa的hql语法提供了内连接的查询方式(不支持复杂hql,比如left join ,right join).  上代码了 1.我们要联查房屋和房屋用户中间表,通过房屋id关联 homeInfo是房屋表,homeUser是房屋用户中间表. homeInfo 1 package management.entity.carandhome; 2 3 import java.io.Serializable; 4 import java.math.BigDecimal;

hibernate 执行原生sql 返回实体list对象

String sql="select gc.* from eportal_goods_category gc "+ " inner JOIN "+ " eportal_goods g on gc.id=g.goods_category_id "+ " INNER JOIN "+ " eportal_seller se on  g.supplier_id=se.id "+ " where se.id

Hibernate HQL和原生SQL查询的一点区别

1.createSQLQuery 1.1默认查询的结果为BigDecimal 1.2通过addScalar("CGD_ID", StandardBasicTypes.LONG)可以将结果直接转为Long StringBuffer sb = new StringBuffer(); sb.append("select g.CGD_ID from em_circle_apply_info a join em_circle_group_def g on a.CAI_CGD_ID =

hibernate之HQL,Criteria与SQL

HQL是针对封装好的对象. HQL :hibernate自己用的sql语句   -------HQL不能出现表中的任何内容 ---------不经常使用开发中 基本查询:String hql = "from com.sikiedu.domain.User"; Query query = session.createQuery(hql);List<User> list = query.list();//查询所有User user = (User) query.uniqueRe

Hibernate的批量查询——原生sql查询

1.查询所有的学生信息: (1)查询结果中,一条信息放入到一个数组中,从list集合中取出数组,并对数组进行遍历. public class GeneratorTest { public static void testSel() { Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); String sql="Select * from Stud

【Hibernate】hibernate原生sql利用transformers返回多表自定义类型对象

大致结构: Person(人): id,name,age,bookId Book(书):id,bookName Author(作者):id,authorName,bookId 一个人 只有 一本书,一本书 有多个 作者,一个作者 只出 一本书:(可能举例不好,明白就行) Person ----> Book : OneToOne Book ----> Author: OneToMany 期望达到的效果: sql: select p.id id,p.name,b.bookName bookName

hibernate使用原生SQL查询返回结果集的处理

今天没事的时候,看到公司框架里有一个用原生SQL写的函数,说实在以前自己也干过这事,但好久都没有用,都忘得差不多了,现在基本都是用的hql语句来查询结果.hibernate中使用createSQLQuery拉来来实现SQL语句的查询,具体用法:session.createSQLQuery(sql),对于用SQL返回的结果集是一个什么样的结果集都毫无记忆.自己查了下,才知道,原来是返回一个Object类型数组的list集合,而其中Object类型的数组里的值则与sql语句中的查询项相对应,如果是s

Hibernate原生sql的查询,返回结果设置到DTO

原生sql的查询,返回结果设置到DTO: Query query = sessionFactoryRtData.getCurrentSession().createSQLQuery(hql.toString()).setResultTransformer(Transformers.aliasToBean(RTDataAttrDto.class));

Hibernate SQLQuery 原生SQL 查询及返回结果集处理-1

第一篇:官方文档的处理方法,摘自官方 在迁移原先用JDBC/SQL实现的系统,难免需要采用hibernat native sql支持. 1.使用SQLQuery hibernate对原生SQL查询执行的控制是通过SQLQuery接口进行的. Session.createSQLQuery(); 1.1标量查询 最基本的SQL查询就是获得一个标量(数值)的列表. sess.createSQLQuery("SELECT * FROM CATS").list(); sess.createSQL