qq_24913711
2017-12-04 15:08
采纳率: 50%
浏览 3.5k
已采纳

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条回答 默认 最新

  • 浪里渔夫 2017-12-05 01:00
    已采纳

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

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

    点赞 评论
  • csdnyby 2017-12-04 15:10

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

    点赞 评论
  • qq_41276280 2017-12-04 15:45

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

    点赞 评论
  • qq_41276768 2017-12-04 17:39

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

    点赞 评论
  • Ultraman_TigaSang 2017-12-05 01:06

    如果想要键值对的形式,就别用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: *** }

    点赞 评论
  • Ultraman_TigaSang 2017-12-05 01:08

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

    点赞 评论
  • 小吴wtz 2017-12-05 01:10

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

    点赞 评论
  • 大耳朵狄元芳 2017-12-05 01:23

    你这种需求可以再写一个配置文件只映射你需要的字段就可以了,然后用那个配置文件

    点赞 评论
  • 果冻剑客 2017-12-05 01:40

    你要明白hibernate 配置文件的作用是将你的实体类与数据库进行映射,并在你使用sql查询时,使用set 方法将值设置进去。你其他属性没有设置当然是空,
    就好比你new一个对象,对象里有三个属性,你手动赋值两个,你也不能让第三个属性直接去掉啊。如果真的有业务需求要用这个对象的属性去循环的话,
    建议你写一个map 将有值的属性取出来,做一下转换

    点赞 评论
  • qq_39093153 2017-12-05 01:51

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

    点赞 评论
  • qq_41278189 2017-12-05 02:00

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

    点赞 评论
  • Reed960512 2017-12-05 04:56

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

    点赞 评论
  • 奥利弗呀 2017-12-21 15:07

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

    点赞 评论

相关推荐 更多相似问题