今天做项目的过程中发现,多表查询的时候如果使用hibernate的DetachedCriteria离线查询方式的时候,

在多表关联的时候我们需要使用别名的方式去实现。

但是代码运行的过程中抛出了下面的异常:

之前出现异常的代码:

    public String pageQuery() throws Exception {
DetachedCriteria dc = pageBean.getDetachedCriteria();
//动态添加过滤条件
String addresskey = model.getAddresskey();
if(StringUtils.isNotBlank(addresskey)){
//添加过滤条件,根据地址关键字模糊查询
dc.add(Restrictions.like("addresskey", "%"+addresskey+"%"));
} Region region = model.getRegion();
if(region != null){
String province = region.getProvince();
String city = region.getCity();
String district = region.getDistrict();
dc.createAlias("region", "r"); //第一次运行不会出错,但是第二次运行就会报错,因为之前已经存在了和它一样的别名,页面又是通过ajax请求的,不会刷新                           
if(StringUtils.isNotBlank(province)){
//添加过滤条件,根据省份模糊查询-----多表关联查询,使用别名方式实现
//参数一:分区对象中关联的区域对象属性名称
//参数二:别名,可以任意
dc.add(Restrictions.like("r.province", "%"+province+"%"));
}
if(StringUtils.isNotBlank(city)){
//添加过滤条件,根据市模糊查询-----多表关联查询,使用别名方式实现
//参数一:分区对象中关联的区域对象属性名称
//参数二:别名,可以任意
dc.add(Restrictions.like("r.city", "%"+city+"%"));
}
if(StringUtils.isNotBlank(district)){
//添加过滤条件,根据区模糊查询-----多表关联查询,使用别名方式实现
//参数一:分区对象中关联的区域对象属性名称
//参数二:别名,可以任意
dc.add(Restrictions.like("r.district", "%"+district+"%"));
}
}
subareaService.pageQuery(pageBean);
this.java2Json(pageBean, new String[]{"currentPage","detachedCriteria","pageSize",
"decidedzone","subareas"});
return NONE;
}

通过查阅资料发现:用DetachedCriteria或者Criteria,使用CreateAlias时,如果第2个参数alias与之前添加的重复,则会报系统异常,

然而遗憾的是我们的DetachedCriteria和Criteria并没有提供排除这种重复的方法。

要想在不修改Hibernate代码的前提下,解决这个问题,我们可以使用JAVA的反射类解决该问题。

下面提供两个函数,用于判断path和alias是否已经添加。

  private boolean existAlias(Criteria c, String path, String alias) {
Iterator itm = ((CriteriaImpl) c).iterateSubcriteria();
while (itm.hasNext()) {
Subcriteria sub = (Subcriteria) itm.next();
if (alias.equals(sub.getAlias()) || path.equals(sub.getPath())) {
return true;
}
}
return false;
} private boolean existAlias(DetachedCriteria c, String path, String alias) {
Class clazz = c.getClass();
try {
Field field = clazz.getDeclaredField("criteria");
field.setAccessible(true);
CriteriaImpl ci;
ci = (CriteriaImpl) field.get(c);
return existAlias(ci, path, alias); } catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} return false;
}

然后在之前的代码中调用提供的方法,并做如下修改可以解决问题

public String pageQuery() throws Exception {
DetachedCriteria dc = pageBean.getDetachedCriteria();
//每一次分页查询的时候应该先清除之前的条件
// 动态添加过滤条件
String addresskey = model.getAddresskey();
if (StringUtils.isNotBlank(addresskey)) {
// 添加过滤条件,根据地址关键字模糊查询
dc.add(Restrictions.like("addresskey", "%" + addresskey + "%"));
} Region region = model.getRegion();
if (region != null) {
String province = region.getProvince();
String city = region.getCity();
String district = region.getDistrict(); //创建别名之前需要判断别名是否存在。
boolean existAlias = existAlias(dc,null,"r");
if(!existAlias){//不存在就创建
dc.createAlias("region", "r");
}
if (StringUtils.isNotBlank(province)) {
// 添加过滤条件,根据省份模糊查询-----多表关联查询,使用别名方式实现
// 参数一:分区对象中关联的区域对象属性名称
// 参数二:别名,可以任意
dc.add(Restrictions.like("r.province", "%" + province + "%"));
}
if (StringUtils.isNotBlank(city)) {
// 添加过滤条件,根据市模糊查询-----多表关联查询,使用别名方式实现
// 参数一:分区对象中关联的区域对象属性名称
// 参数二:别名,可以任意
dc.add(Restrictions.like("r.city", "%" + city + "%"));
}
if (StringUtils.isNotBlank(district)) {
// 添加过滤条件,根据区模糊查询-----多表关联查询,使用别名方式实现
// 参数一:分区对象中关联的区域对象属性名称
// 参数二:别名,可以任意
dc.add(Restrictions.like("r.district", "%" + district + "%"));
}
}
subareaService.pageQuery(pageBean);
this.java2Json(pageBean,
new String[] { "currentPage", "detachedCriteria", "pageSize", "decidedzone", "subareas" });
return NONE;
}

别名重复问题之后,我们还需要解决的问题就是:

如何清除hibernate的上次查询条件,如果不清除,将会导致上次的查询条件和下次的查询条件合并到了一起。

具体参见:http://www.cnblogs.com/jepson6669/p/8876920.html

org.hibernate.QueryException: duplicate alias: r hibernate别名重复问题解决的更多相关文章

  1. org.hibernate.QueryException: Unable to resolve path [SecWilldosetdate.name],xxxxxxxx...异常处理

    今天在写hql语句的时候出现了这个错误,然后一直运行到执行hql这儿就出错了.页面报500. 原hql如下: String hql = "from SecWilldosetdate wher ...

  2. nested exception is org.hibernate.QueryException: could not resolve property

    SSH框架出现了下面的错误: nested exception is org.hibernate.QueryException: could not resolve property 检查了hbm.x ...

  3. org.hibernate.QueryException: could not resolve property

    org.hibernate.QueryException: could not resolve property HibernateSQLXML  org.hibernate.QueryExcepti ...

  4. org.hibernate.MappingException: duplicate import异常

    在开发hibernate时,一起多谢ORM类和映射文件时,报出:org.hibernate.MappingException: duplicate import com.XXX异常 解决方案: 检查你 ...

  5. org.hibernate.QueryException: could not resolve property: address of:

    Hibernate: select count(*) as y0_ from test.course this_ org.hibernate.QueryException: could not res ...

  6. Caused by:org.hibernate.DuplicateMappingException:Duplicate class/entity/ mapping

    1.错误描述 java.lang.ExceptionInInitializerError Caused by:org.hibernate.InvalidMappingException:Could n ...

  7. weblogic 下异常 org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken

    项目之前在 Tomcat 环境下一直都正常运行,今天应客户要求需要迁移到 webLogic 10.3.6 下, 部署后竟然抛出了 org.hibernate.QueryException: Class ...

  8. org.hibernate.QueryException: JPA-style positional param was not an integral ordinal; nested exception is java.lang.IllegalArgumentException: org.hibernate.QueryException: JPA-style positional param w

    org.hibernate.QueryException: JPA-style positional param was not an integral ordinal; nested excepti ...

  9. 解决org.hibernate.QueryException illegal attempt to dereference collection 异常错误

    今天做项目的时候,有两个实体:款式.品牌两者关系是多对多的关联关系,实现的功能是:通过选择款式,显示出该款式的所有品牌.HQL语句如下: 运行时出现这个异常错误:org.hibernate.Query ...

随机推荐

  1. jeecms如何迭代list集合

    [@cms_channel_list][#list tag_list as a ]${a.name} [/#list][/@cms_channel_list]使用[XXX_list] 参数为 tag_ ...

  2. Azure SQL作業

    由於要定期去刪除比較久的資料,礙於Azure SQL DB目前無法直接創建作業,目前找到一種方式就是通過local的SQL SERVER來執行AZURE SQL指令. 步驟如下: SQL Server ...

  3. Qt中QBitmap 的使用 --QBitmap的作用

    特别注意:如果想把做一个先把图画在内存中,在显示到页面,不要使用bitmap,这个只有单色: 一般情况下QBitmap只作为图片掩码使用,比如做不规则窗口. QBitmap表示一种只有黑白的单色图片, ...

  4. Kotlin 字符模板

    Kotlin的字符模板和c语言的格式化输出有点像. 先来说说Kotlin 的字符模板怎么弄. fun main(args:Array<String>) { var name="T ...

  5. 【转】如何把CD上的音乐拷贝到电脑上

    参考:https://www.ixueshu.com/document/9c44893da6e90cf7318947a18e7f9386.html 参考:https://jingyan.baidu.c ...

  6. [原创]ObjectARX开发环境搭建之VS2010+ObjectARX2012Wizard+Addin工具条问题修复

    目前ObjectARX版本越来越高,也越来越简化开发,如果需要同时开发低版本和高版本的ARX程序,就需要搭建批量编译环境,以满足ARX开发的需要. 批量编译的搭建网络上已经有了很多的教程,基本上都是基 ...

  7. 关于nmake cl.exe error 0xc0000135

    [问题] F:\STLport-5.1.4\build\lib>nmake /f msvc.mak cl /nologo /W4 /Wp64 /GR /EHsc /Zm800 /GL /MD / ...

  8. Unity---动画系统学习(5)---使用MatchTarget来匹配动画

    1. 介绍 做好了走.跑.转弯后,我们就需要来点更加高级的动画了. 我们使用自带动画学习笔记2中的FQVault动画,来控制人物FQ. 在动画学习笔记4的基础上添加Vault动画. 添加一个参数Vau ...

  9. c++11中关于`std::thread`线程传参的思考

    关于std::thread线程传参的思考 最重要要记住的一点是:参数要拷贝到线程独立内存中,不管是普通类型.还是引用类型. 对于传递参数是引用类型,需要注意: 1.当指向动态变量的指针(char *) ...

  10. 30 个 Java 集合面试问题及答案

    30 个 Java 集合面试问题及答案 Java集合框架为Java编程语言的基础,也是Java面试中很重要的一个知识点.这里,我列出了一些关于Java集合的重要问题和答案. 1.Java集合框架是什么 ...