如何在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;
}
但是我最后的结果集,还是把其他那一堆的字段全带上了,只不过没赋值而已,怎样才能让他得到的结果集里没有别的乱七八糟的属性,只有我想要的字段的?
类Game里的其他属性是没办法去掉的,因为你New这个Game对象时,那些属性就已经存在了,只不过hibernate根据hql查询的结果对部分属性进行了赋值。
如果你非要得到只包含部分属性的一个实体对象,你可以创建一个新的类,例如Game2,这个Game2里只包含了你想要的属性,然后让Hibernate映射下这个 Game2。
当然这样操作是很麻烦的,如果我哪天需要别的属性了,还要改这个类;或者我需要其他部分属性组合的实体的话,还要再创建一个类。所以你最好是用HashMap来解决这种变化的需求。
另外,你只要包含这些属性的实体对象是干什么用呢?
不过没赋值而已,怎样才能让他得到的结果集里没有别的乱七八糟的属性,只有我想要的字段的?
1)建立实体-数据库表的映射文件 *.hbm.xml。
2)Session session =sessionFactory.openSession();
String hql = "from build";
List list = (List)session.createQuery(hql).list();
HQL语句操作的是po类,也就是实体类。hql通过映射文件,将类名和表名、类属性和表字段一一对应起来。
这样的话最后得到的结果是一个list数组,单纯的value形式吧,我最后要的是只有我想要的字段组成的一个实体,Key-Value形式的
如果想要键值对的形式,就别用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
打得太急了,有个地方写错了,创建BaseDao时直接private BaseDao baseDao加上注解就好了,不用new
你这种需求可以再写一个配置文件只映射你需要的字段就可以了,然后用那个配置文件
你要明白hibernate 配置文件的作用是将你的实体类与数据库进行映射,并在你使用sql查询时,使用set 方法将值设置进去。你其他属性没有设置当然是空,
就好比你new一个对象,对象里有三个属性,你手动赋值两个,你也不能让第三个属性直接去掉啊。如果真的有业务需求要用这个对象的属性去循环的话,
建议你写一个map 将有值的属性取出来,做一下转换
把构造方法的名Game换成和数据表的名不一样试试
用hashmap 来实现你的需求不要想着用实体来实现
这样的话最后得到的结果是一个list数组,单纯的value形式吧
select 后面加上你要查询的字段,用逗号隔开