Hibernate query.list()

简介: 在Hibernate中,用hql语句查询实体类,采用List方法的返回结果为一个List,该List中封装的对象分为以下三种情况。

在Hibernate中,用hql语句查询实体类,采用List方法的返回结果为一个List,该List中封装的对象分为以下三种情况。

我们通过实例来对这三种情况进行说明,首先看一下数据情况,红色区域这两条数据是我们要查的。
在这里插入图片描述
这里查询采用得是两个字段组合查询,测试方法如下:

public void test() {
   
   
    String ids = "1001A4100000003GURZY,1001A4100000003HS5W500101";
    String[] idsArray = ids.split(",");
    List<String> list = Arrays.asList(idsArray);
    String data = querySomeAccounts(list);
    System.out.println("data:" + data);
}
  1. 查询全部字段的情况下,如"from 实体类",List中封装的对象为实体类本身,各属性都将得到填充。
public String querySomeAccounts(List<String> list){
   
   
    String hql = "from Spkbkt_indicator_relationship where (sosspk || sosaac) in (:alist)";
    Query query = this.getSession().createQuery(hql);
    query.setParameterList("alist", list);
    List<Spkbkt_indicator_relationship> dataList = query.list();

    JSONArray dataArray = new JSONArray();
    //循环取值
    for(Spkbkt_indicator_relationship data : dataList){
   
   
        String sosaac = data.getSosaac();
        //null处理
        if(sosaac == null) {
   
   
            sosaac = "";
        }

        JSONObject rows = new JSONObject();
        //虽然全查了,但实际上我只要部分值
        rows.put("id", data.getSosspk() + sosaac);
        rows.put("acc_code", data.getAcc_code());
        rows.put("sosspk", data.getSosspk());
        rows.put("sosaac", sosaac);

        dataArray.add(rows);
    }       
    //回传
    if(dataList != null && dataList.size() > 0){
   
   
        return dataArray.toString();
    }else{
   
   
        return "";
    }
}

//输出结果
data:[{
   
   "id":"1001A4100000003GURZY","acc_code":"C000008","sosspk":"1001A4100000003GURZY","sosaac":""},{
   
   "id":"1001A4100000003HS5W500101","acc_code":"S000003","sosspk":"1001A4100000003HS5W5","sosaac":"00101"}]
  1. 只查询一个字段,默认情况下,List中封装的是Object对象。
public String querySomeAccounts(List<String> list){
   
   
    String hql = "select acc_code from Spkbkt_indicator_relationship where (sosspk || sosaac) in (:alist)";
    Query query = this.getSession().createQuery(hql);
    query.setParameterList("alist", list);
    List<Object> dataList = query.list();

    JSONArray dataArray = new JSONArray();
    //循环取值
    for(Object data : dataList){
   
   
        JSONObject rows = new JSONObject();
        //只查询一个值
        rows.put("acc_code", data);

        dataArray.add(rows);
    }       
    //回传
    if(dataList != null && dataList.size() > 0){
   
   
        return dataArray.toString();
    }else{
   
   
        return "";
    }
}

//输出结果
data:[{
   
   "acc_code":"C000008"},{
   
   "acc_code":"S000003"}]
  1. 查询两个或两个以上的字段,默认情况下,List中封装的是Object[],长度与所查询的字段数一致。
public String querySomeAccounts(List<String> list){
   
   
    String hql = "select acc_code,sosspk,sosaac from Spkbkt_indicator_relationship where (sosspk || sosaac) in (:alist)";
    Query query = this.getSession().createQuery(hql);
    query.setParameterList("alist", list);
    List<Object[]> dataList = query.list();

    JSONArray dataArray = new JSONArray();
    //循环取值
    for(Object[] data : dataList){
   
   
        //所查询的第三个字段
        String sosaac = (String) data[2];
        //null处理
        if(sosaac == null) {
   
   
            sosaac = "";
        }

        JSONObject rows = new JSONObject();

        rows.put("id", data[1] + sosaac);
        //所查询的第一个字段
        rows.put("acc_code", data[0]);
        //所查询的第二个字段
        rows.put("sosspk", data[1]);
        rows.put("sosaac", sosaac);

        dataArray.add(rows);
    }       
    //回传
    if(dataList != null && dataList.size() > 0){
   
   
        return dataArray.toString();
    }else{
   
   
        return "";
    }
}

//输出结果
data:[{
   
   "id":"1001A4100000003GURZY","acc_code":"C000008","sosspk":"1001A4100000003GURZY","sosaac":""},{
   
   "id":"1001A4100000003HS5W500101","acc_code":"S000003","sosspk":"1001A4100000003HS5W5","sosaac":"00101"}]

对于后两种情况,用标签遍历时不太方便,因为无法直接转换成实体类的对象。

比较简单的解决方法是:在hql中使用 select new 包名.类名(属性1,属性2……) from 实体类,同时在实体类中添加带参的构造方法,参数的个数和顺序与(属性1,属性2……) 保持一致,这样我们得到的list中存放的依然是实体类的对象,所查询到的属性得到了填充,使用起来更为方便。

相关文章
|
4月前
|
存储 SQL Java
|
Java 数据库连接
hibernate-validator校验对象属性为List
hibernate-validator校验对象属性为List
199 1
|
SQL 缓存 数据库
Hibernate-ORM:05.Hibernate中的list()和iterator()
  ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------       Hibernate中查多条(全部)使用list()或iterator() 本篇介绍:   1.
1217 0
|
SQL Java 数据库连接
Hibernate中执行NativeSQL语句查询返回自定义类型的POJO实例的List(多表查询)
Hibernate中定义了hql的概念,简单地说就是,为java的码农提供了一套类似于sql的语法,但是数据表名变成了PO名,数据字段名变成了PO中属性成员名,并把这种语法称为hql。优点就是:hql看上去是面向对象的,码农不需要知道数据库中数据表的结构,只需要依据PO编写面向对象的数据库增删改查的语句。
4174 0
|
Java 数据库连接 数据库
Hibernate之集合映射的使用(Set集合映射,list集合映射,Map集合映射)
a:数据库的相关知识:   (1):一个表能否有多个主键:不能;   (2):为什么要设置主键:数据库存储的数据都是有效的,必须保持唯一性;   (3)为什么id作为主键:因为表中通常找不到合适的列作为唯一列,即主键,所有为了方便用id列,因为id是数据库系统维护可以保证唯一,所以就把这列...
5092 0
|
SQL Java 数据库连接
Hibernate查询之SQL查询,查询结果用new新对象的方式接受,hql查询,通过SQL查询的结果返回到一个实体中,查询不同表中内容,并将查到的不同表中的内容放到List中
 package com.ucap.netcheck.dao.impl; import java.util.ArrayList;import java.util.List; import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.spring
1214 0
|
Java 数据库连接 数据库
hibernate取数据时iterator和list的区别
用List,List将会把数据拿到内存里面,但是它要用的时候不会到内存里面去拿,这里是二级缓存 session.createQuery("from Test").list();   用Iterator,用Iterator时,如果它要用数据它会先到内存中去拿,如果内存中没有的话,它才会到数据库中去取,并且能够把数据Load到内存中!这里说的也是二级缓存 session.
1007 0
|
7月前
|
SQL 缓存 Java
框架分析(9)-Hibernate
框架分析(9)-Hibernate