Dept和Emp是一对多关系,我这样使用createCriteria关联两个实体(一对多)在Expression.sql中这样使用{alias}区分两个实体为生成的sql不对,代码如下:
package org.test;import java.util.Collection;
import java.util.Iterator;
import java.util.List;import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Expression;
import org.itfuture.www.admin.Dept;public class TestApp{ public TestApp() {
}
public static void main(String[] args)
{
query(" and {alias}.deptNaMe is not null and {alias}.A.empname is not null");
}
public static void query(String cond)
{
Configuration conf=new Configuration().configure();
SessionFactory f=conf.buildSessionFactory();
Session s=f.openSession();
Criteria c=s.createCriteria(Dept.class).createAlias("emps","A").add(Expression.sql("1=1 "+cond));
List list=c.list();
System.out.println(list);
s.close();
f.close();
}
}
Dept和Emp的hbm配置如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="org.admin">
<class name="Dept" table="dept">
<id name="deptid" type="java.lang.Integer" column="deptid">
<generator class="assigned"></generator>
</id>
<property name="deptname" type="java.lang.String" column="deptname"/>
<property name="deptnum" type="java.lang.Integer" column="deptnum"></property>
<property name="deptdesc" type="java.lang.String" column="deptdesc"></property>
<set name="emps" table="emp" cascade="all" lazy="false" outer-join="false" inverse="false"><!--????-->
<key column="deptid"></key>
<one-to-many class="Emp"/>
</set>
</class>
</hibernate-mapping> <?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="org.admin">
<class name="Emp" table="emp">
<id name="empid" type="integer" column="empid">
<generator class="assigned"></generator>
</id>
<property name="empname" type="string" column="empname"/>
<property name="sex" type="string" column="sex"/>
<property name="age" type="integer" column="age"/>
<property name="phone" type="string" column="phone"/>
<property name="address" type="string" column="address"/>
<many-to-one name="onedept" class="Dept" column="deptid" cascade="save-update"></many-to-one>
</class>
</hibernate-mapping>
package org.test;import java.util.Collection;
import java.util.Iterator;
import java.util.List;import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Expression;
import org.itfuture.www.admin.Dept;public class TestApp{ public TestApp() {
}
public static void main(String[] args)
{
query(" and {alias}.deptNaMe is not null and {alias}.A.empname is not null");
}
public static void query(String cond)
{
Configuration conf=new Configuration().configure();
SessionFactory f=conf.buildSessionFactory();
Session s=f.openSession();
Criteria c=s.createCriteria(Dept.class).createAlias("emps","A").add(Expression.sql("1=1 "+cond));
List list=c.list();
System.out.println(list);
s.close();
f.close();
}
}
Dept和Emp的hbm配置如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="org.admin">
<class name="Dept" table="dept">
<id name="deptid" type="java.lang.Integer" column="deptid">
<generator class="assigned"></generator>
</id>
<property name="deptname" type="java.lang.String" column="deptname"/>
<property name="deptnum" type="java.lang.Integer" column="deptnum"></property>
<property name="deptdesc" type="java.lang.String" column="deptdesc"></property>
<set name="emps" table="emp" cascade="all" lazy="false" outer-join="false" inverse="false"><!--????-->
<key column="deptid"></key>
<one-to-many class="Emp"/>
</set>
</class>
</hibernate-mapping> <?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="org.admin">
<class name="Emp" table="emp">
<id name="empid" type="integer" column="empid">
<generator class="assigned"></generator>
</id>
<property name="empname" type="string" column="empname"/>
<property name="sex" type="string" column="sex"/>
<property name="age" type="integer" column="age"/>
<property name="phone" type="string" column="phone"/>
<property name="address" type="string" column="address"/>
<many-to-one name="onedept" class="Dept" column="deptid" cascade="save-update"></many-to-one>
</class>
</hibernate-mapping>
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货