//LimsMeasPay类
public class LimsMeasPay {
private Integer id;
private LimsMeasContractSample limsMeasContractSample;
}hibernate映射文件为<many-to-one name="limsMeasContractSample" property-ref="contractSampleId" class="model.LimsMeasContractSample" fetch="select">
            <column name="contract_sample_id" length="25" not-null="true" />
</many-to-one>
//LimsMeasContractSample类public class LimsMeasContractSample {
private Integer id;
private Set<LimsMeasContractSampleFlowTo> limsMeasContractSampleFlowTos = new HashSet<LimsMeasContractSampleFlowTo>(0);
}它的hibernate映射文件是<set name="limsMeasContractSampleFlowTos" inverse="true">
       <key column="contract_sample_id" property-ref="contractSampleId" />
       <one-to-many class="cn.com.zhouphratry.core.webapp.model.LimsMeasContractSampleFlowTo" />
</set>//LimsMeasContractSampleFlowTo类
public class LimsMeasContractSampleFlowTo {
private Integer id;
private Set<LimsMeasContractSampleFlowToParam> limsMeasContractSampleFlowToParams = 
  new HashSet<LimsMeasContractSampleFlowToParam>(0);
}LimsMeasContractSampleFlowTo类的hibernate映射文件为  <set name="limsMeasContractSampleFlowToParams" inverse="true">
            <key column="flow_to_id" property-ref="flowToId" />
            <one-to-many class="cn.com.zhouphratry.core.webapp.model.LimsMeasContractSampleFlowToParam" />
  </set>//LimsMeasContractSampleFlowToParam类
public class LimsMeasContractSampleFlowToParam {
private Integer id;
private String paramId;//小组部门编号
}我想通过paramId查询到LimsMeasPay 怎么做到
后台action里代码是 hql = "from LimsMeasPay lmp where 1=1",后台我无法改动
前台js页面上是
 where = "and lmp.limsMeasContractSample.limsMeasContractSampleFlowTos.limsMeasContractSampleFlowToParams.paramId in ('1','2')"
结果报错:org.hibernate.QueryException: illegal attempt to dereference collection [limsmeaspa0_.idlimsmeaspa0_.contract_sample_idlimsMeasContractSample.limsMeasContractSampleFlowTos] with element property reference [limsMeasContractSampleFlowToParams] 
然后我又把条件改为" and lmp.limsMeasContractSamplein ( " +
"select lmcs from LimsMeasContractSample lmcs where lmcs.limsMeasContractSampleFlowTos.id in ( " +
" select lmcsft  from LimsMeasContractSampleFlowTo lmcsft where lmcsft.limsMeasContractSampleFlowToParams in ( " +
" select lmcsftp from LimsMeasContractSampleFlowToParam lmcsftp where lmcsftp.paramId in ( " +
" '1','2'" +
")"+
")"+
")" +
")";还是报错
郁闷呀,路过的走过的帮个忙哈,谢谢啦

解决方案 »

  1.   

    我写的是前台js查询代码,用ext做的
      

  2.   

    第二种写法报错为:
     Servlet.service() for servlet default threw exception
    org.hibernate.hql.ast.QuerySyntaxException: unexpected token: select near line 1, column 258 [from cn.com.zhouphratry.core.webapp.model.LimsMeasPay lmp where 1=1 and  lmp.status = 1 and lmp.limsMeasContractSample in ( select lmcs from cn.com.zhouphratry.core.webapp.model.LimsMeasContractSample lmcs where lmcs.limsMeasContractSampleFlowTos.id in (1  select lmcsft  from cn.com.zhouphratry.core.webapp.model.LimsMeasContractSampleFlowTo lmcsft where lmcsft.limsMeasContractSampleFlowToParams in (  select lmcsftp from cn.com.zhouphratry.core.webapp.model.LimsMeasContractSampleFlowToParam lmcsftp where lmcsftp.paramId in (  select oso.cid from cn.com.zhouphratry.core.webapp.model.OssSysOrganize oso where oso.name like '%' and oso.signature='MEAS_DEPARTMENT' )))) order by lmp.id desc]
    at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
      

  3.   

    那是后台的,不是我写的,1=1没问题,因为要接受前台的hql语句,前台的语句是" and ……",所以要加上1=1
      

  4.   

    这个和什么ext没有关系,是你的hql写错了
    lmp.limsMeasContractSample 不是引用limsMeasContractSample这个对象,是他所对应的列
    第二种也不对
     lmp.limsMeasContractSample 这个表示的是"contract_sample_id"
    而select lmcs from .....    lmcs  表示的是个对象
    所以肯定不对 
    and lmp.limsMeasContractSample in ( " +
    "select lmcs from LimsMeasContractSample lmcs where l.............
    改成这样都在试试吧,
    and lmp.limsMeasContractSample in ( " +
    "select lmcs.id from LimsMeasContractSample lmcs where l.............good luck
      

  5.   

    先查找到LimsMeasContractSampleFlowToParam 对象:from LimsMeasContractSampleFlowToParam ftp where ftp.paramId in ('1','2') 
    后查找对一个的LimsMeasConractSampleFlowTo ft 对象:from LimsMeasConractSampleFlowTo ft where ft.limsMeasContractSampleFlowToParam in 
    (from LimsMeasContractSampleFlowToParam ftp where ftp.paramId in ('1','2') )依次往回找,就能得到最后的LimsMeasPay lmp 对象了个人感觉道理就是这样,代码没有测试,可能有问题。给分吧!别浪费啦