我已经在hbm文件中添加了复合文件,如下所示
<hibernate-mapping>
<class name="EmployeeSignin" table="EMPLOYEE_SIGNIN">
<composite-id name="id" class="EmployeeSigninId">
<key-property name="empId" type="string">
<column name="EMP_ID" length="10" />
</key-property>
<key-property name="signinDate" type="date">
<column name="SIGNIN_DATE" length="7" />
</key-property>
</composite-id>
</class>
</hibernate-mapping>
现在我想按如下方式查询
select * from EmployeeSignin where emp_id='12345' and signin_date > 'some initial date' and signin_date<= 'some last date'
我不明白如何才能实现同样的效果,因为有一个组合键,它引用了EmployeeSignId。这种情况下如何创建条件查询?
我在下面尝试过,但没有得到任何记录
Criteria empAttendanceCr=session2.createCriteria(EmployeeSigninId.class);
Criterion attdDateCondition = Restrictions.conjunction()
.add(Restrictions.eq("empId", user.getEmpId()))
.add(Restrictions.le("signinDate", lastDate))
.add(Restrictions.ge("signinDate", startDate));
List empAttendanceList=empAttendanceCr
.add(attdDateCondition).list();
发布于 2013-09-05 18:50:46
问题解决了。
我在下面试过了,它起作用了
Criteria empAttendanceCr=session2.createCriteria(EmployeeSignin.class);
//EmployeeSigninId empId=new EmployeeSigninId(user.getEmpId().toString());
Criterion attdDateCondition = Restrictions.conjunction()
.add(Restrictions.eq("id.empId",user.getEmpId().toString()))
.add(Restrictions.le("id.signinDate", lastDate))
.add(Restrictions.ge("id.signinDate", startDate));
发布于 2015-10-26 18:27:44
Criteria query还提供了直接在primaryId上添加标准的功能,例如
Criteria criteria = session.createCriteria("the class you want to fetch");
criteria.add(Restrictions.idEq("The primary id"));
现在这个组合键的主Id是一个java对象,那么我们可以直接使用它吗?是的,如果我们在组合键对象中正确定义了equals()和hashCode()函数,并且代码如下所示,我们就可以做到:
Criterion attdDateCondition = Restrictions.conjunction()
.add(Restrictions.idEq("id", new CompositeKey("empId", "lastDate", "startDate"));
假设CompositeKey是组合键的java对象,并且它有一个接受三个参数的构造函数,如下所示。我没有使用XML映射做到这一点,因此不知道如何在xml中定义equals和hashCode函数。
谢谢
发布于 2018-07-30 02:17:55
对于Hibernate jpa 2.1和更高版本使用
CriteriaBuilder builder = sessionFactory.getCriteriaBuilder();
CriteriaQuery<EmployeeSignin> query = builder.createQuery(EmployeeSignin.class);
Root<EmployeeSignin> root = query.from(EmployeeSignin.class);
query.select(root).where(
builder.equal(root.get("id").get("empId"), user.getEmpId().toString()),
builder.le(root.get("id").get("signinDate"), lastDate),
builder.ge(root.get("id").get("signinDate"), startDate),
);
Query<EmployeeSignin> q = sessionFactory.getCurrentSession().createQuery(query);
List<EmployeeSignin> employeeSigninList = q.getResultList();
https://stackoverflow.com/questions/18633941
复制相似问题