hibernate中执行hql语句,只查询部分字段得到的结果集也只有那一部分字段的属性

如何在hibernate中执行hql语句,只查询部分字段得到的结果集也只有那一部分字段的属性,我试过select new Game(autoid,name,pinyin,initial,appkey,type) from Game
并且在对应的实体当中也创建了构造方法,DEBUG进去也确实是执行了

    public Game(Integer autoid, String name, String pinyin, String initial,
            String appkey, String type) {

        this.autoid = autoid;
        this.name = name;
        this.pinyin = pinyin;
        this.initial = initial;
        this.appkey = appkey;
        this.type = type;
    }

但是我最后的结果集,还是把其他那一堆的字段全带上了,只不过没赋值而已,怎样才能让他得到的结果集里没有别的乱七八糟的属性,只有我想要的字段的?

13个回答

类Game里的其他属性是没办法去掉的,因为你New这个Game对象时,那些属性就已经存在了,只不过hibernate根据hql查询的结果对部分属性进行了赋值。
如果你非要得到只包含部分属性的一个实体对象,你可以创建一个新的类,例如Game2,这个Game2里只包含了你想要的属性,然后让Hibernate映射下这个 Game2。
当然这样操作是很麻烦的,如果我哪天需要别的属性了,还要改这个类;或者我需要其他部分属性组合的实体的话,还要再创建一个类。所以你最好是用HashMap来解决这种变化的需求。

另外,你只要包含这些属性的实体对象是干什么用呢?

不过没赋值而已,怎样才能让他得到的结果集里没有别的乱七八糟的属性,只有我想要的字段的?

如果想要键值对的形式,就别用hql,用原生的sql语句,然后以List>的形式封装数据
这里有个通用的方法:BaseDaoImpl(用不用接口的方式你自己决定)

 public List<Map<Object, Object>> find(final String sql,final Object... values)throws DataAccessException {
        return getHibernateTemplate().executeWithNativeSession(new HibernateCallback<List<Map<Object, Object>>>() {
            @Override
            public List<Map<Object, Object>> doInHibernate(Session session) throws HibernateException {
                Query queryObject = session.createSQLQuery(sql);
                if (values != null) {
                    for (int i = 0; i < values.length; i++) {
                        queryObject.setParameter(i, values[i]);
                    }
                }
                return queryObject.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
            }
        });
    }

使用也很方便:

@Resource
BaseDao baseDao = new BaseDao();
public List<Map<Object, Object>> queryGames(String condition, ...其他参数) {
    StringBuffer sql = new StringBuffer("select column1, column2, column3 from my_table where 1=1");
        sql.append("and name like '%").append(condition).append("%'");
        return baseDao.find(sql.toString());
}

最终得到的数据形式是:{ column1: **, column2: **, column3: *** }

打得太急了,有个地方写错了,创建BaseDao时直接private BaseDao baseDao加上注解就好了,不用new

把构造方法的名Game换成和数据表的名不一样试试

用hashmap 来实现你的需求不要想着用实体来实现

这样的话最后得到的结果是一个list数组,单纯的value形式吧

select 后面加上你要查询的字段,用逗号隔开

1)建立实体-数据库表的映射文件 *.hbm.xml。
2)Session session =sessionFactory.openSession();
String hql = "from build";
List list = (List)session.createQuery(hql).list();
HQL语句操作的是po类,也就是实体类。hql通过映射文件,将类名和表名、类属性和表字段一一对应起来。

qq_24913711
qq_24913711 这样的话最后得到的结果是一个list数组,单纯的value形式吧,我最后要的是只有我想要的字段组成的一个实体,Key-Value形式的
2 年多之前 回复

这样的话最后得到的结果是一个list数组,单纯的value形式吧,我最后要的是只有我想要的字段组成的一个实体,Key-Value形式的

共13条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐