我在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。在这种情况下如何创建条件查询?
我尝试过以下但是获得了0条记录
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();
答案 0 :(得分:4)
问题已解决。
我在下面尝试了
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));
答案 1 :(得分:0)
Criteria查询还提供直接在primaryId上添加Criterion 像
这样的东西Criteria criteria = session.createCriteria("the class you want to fetch");
criteria.add(Restrictions.idEq("The primary id"));
现在,在Composite Key的情况下,这个主要ID是一个java对象,我们可以直接使用它吗? 是的,如果我们在复合键对象中正确定义equals()和hashCode()函数,那么我们就可以了,代码如下:
Criterion attdDateCondition = Restrictions.conjunction()
.add(Restrictions.idEq("id", new CompositeKey("empId", "lastDate", "startDate"));
假设CompositeKey是复合键的java对象,它有一个接受三个参数的构造函数,如上所示。 我没有使用xml映射完成此操作,因此不知道如何在XML中定义equals和hashCode函数。
答案 2 :(得分:0)
对于Hibernate jpa 2.1及更高版本使用
map
答案 3 :(得分:-2)
我已实施以下解决方案来解决此问题。
final CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
CriteriaQuery<ProductMapping> criteriaQuery = criteriaBuilder.createQuery(ProductMapping.class);
Root<ProductMapping> root = criteriaQuery.from(ProductMapping.class);
criteriaQuery.select(root).where(
criteriaBuilder.like(root.get("ck_productmapping").get("supplierCode"), supplierCode),
criteriaBuilder.notEqual(root.get("ck_productmapping").get("productCode"), productCode));
Query sqlResult = sessionFactory.getCurrentSession().createQuery(criteriaQuery);
List<ProductMapping> productList = (List<ProductMapping>)sqlResult.getResultList();