hibernate QBE如何实现多表查询

great_king 2008-05-02 11:41:51
使用qbe查询一个对象没有问题,但是实际上我们很多时候需要对多表的多个对象查询。我看孙卫琴的书上说可以同时加载两个对象来做qbe的查询。我试着做了一个,但是只能查查出主表,一加载从表对象就报错。代码如下:

/**
* 使用对象数组的查询方法
*
* @param c:查询的类
* @param obj:查询的对象
* @param orber:按那个字段排序
* @param row:每页多少条记录
* @param page:第几页
* @return List: 集合
*/
public List find(Class c, Object[] obj, String[] order, int row, int page) {
// 用spring的类创建session
Session session = this.getSession();
List list = null;
try {
Criteria criteria = session.createCriteria(c);
if (obj != null) {
for (int i = 0; i < obj.length; i++) {
if (obj[i]!=null) {
Example example = Example.create(obj[i]);
example.enableLike(MatchMode.ANYWHERE);// 匹配模式,使用模糊查询必填项。
// example.excludeNone();//空的不做查询条件
example.excludeZeroes();// 0不要查询
example.ignoreCase();
criteria.add(example);
}
}

}

if (row != 0 && page != 0) {
criteria.setMaxResults(row);// 最大显示记录数
criteria.setFirstResult((page - 1) * row);// 从第几条开始
}

// 判断是否有排序请求,如果有加入到排序方法中
if (order != null) {
for (int i = 0; i < order.length; i++)
criteria.addOrder(Order.desc(order[i]));
}
list = criteria.list();
} catch (HibernateException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} finally {
session.close();
}
return list;
}

Object[] obj中有两个对象,是多对一的关系。
Class c 是多方的实体类。
单独加载多方对象没有问题,
但是加载一方对象就会出错。java.lang.ClassCastException: com.accp.dao.bean.XtSb
XtSb是一方的实体类。

难道是我的逻辑上有什么问题吗?

...全文
1050 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Qiao0328 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
从新发一遍代码,上面的看其来有点乱
Java code

/**
* 使用对象数组的查询方法
*
* @param c:查询的类
* @param obj:查询的对象
* @param orber:按那个字段排序
* @param row:每页多少条记录
* @param page:第几页
* @return L……
[/Quote]


楼主可以实现多表查询了吗???我也遇到了,求赐教!!!!!!!!!!!!!!!!!!
great_king 2008-05-03
  • 打赏
  • 举报
回复

从新发一遍代码,上面的看其来有点乱

/**
* 使用对象数组的查询方法
*
* @param c:查询的类
* @param obj:查询的对象
* @param orber:按那个字段排序
* @param row:每页多少条记录
* @param page:第几页
* @return List: 集合
*/
public List find(Class c, Object[] obj, String[] order, int row, int page) {
// 用spring的类创建session
Session session = this.getSession();
List list = null;
int cou=1;
try {
Criteria criteria=null;
if (obj != null) {
for (int i = 0; i < obj.length; i++) {
if (obj[i]!=null) {
Class c1=obj[i].getClass();
criteria=session.createCriteria(c1);
Example example = Example.create(obj[i]);
//example.enableLike(MatchMode.ANYWHERE);// 匹配模式,使用模糊查询必填项。
// example.excludeNone();//空的不做查询条件
example.excludeZeroes();// 0不要查询
example.ignoreCase();
criteria.add(example);
cou++;
}
}
}
if(cou==1)
criteria=session.createCriteria(c);


if (row != 0 && page != 0) {
criteria.setMaxResults(row);// 最大显示记录数
criteria.setFirstResult((page - 1) * row);// 从第几条开始
}

// 判断是否有排序请求,如果有加入到排序方法中
if (order != null) {
for (int i = 0; i < order.length; i++)
criteria.addOrder(Order.desc(order[i]));
}
list = criteria.list();
} catch (HibernateException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} finally {
session.close();
}
return list;
}



great_king 2008-05-03
  • 打赏
  • 举报
回复
加载从表后报错原因找出来了,不能做order排序。取消排序后就ok啦。但是为什么不能排序呢?这也是一个问题。且不管这个问题。
现在的问题是,用这段代码只能返回最后一个对象的集合,而不是两个对象的联查集合。
比如obj[]有两个对象,obj[0] obj[1]。只能返回obj[1]的结果。这是为什么呢?
great_king 2008-05-02
  • 打赏
  • 举报
回复
主要是要使用多值查询。通过对象传送。这样我写一个dao层就可以通用。
cchaha 2008-05-02
  • 打赏
  • 举报
回复
多表查询为什么要用QBE,QBC?
我从来都是用HQL检索方式,举个例子:
这样

public List listUser() throws DataAccessException, HibernateException {

return (List) getHibernateTemplate().find("select u.username, r.roomname from User u,Room r where u.userid=r.userid");
}

67,516

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧