Java Hibernate:如何使用条件查询从复合键获取记录

Java Hibernate:如何使用条件查询从复合键获取记录,java,hibernate,Java,Hibernate,我在hbm文件中添加了复合文件,如下所示 <hibernate-mapping> <class name="EmployeeSignin" table="EMPLOYEE_SIGNIN"> <composite-id name="id" class="EmployeeSigninId"> <key-property name="empId" type="string"> <column name="EM

我在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'
问题解决了

我试着在下面工作

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));

Criteria查询还提供了直接在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函数


感谢使用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();
CriteriaBuilder=sessionFactory.getCriteriaBuilder();
CriteriaQuery=builder.createQuery(EmployeeSignin.class);
Root=query.from(EmployeeSignin.class);
查询。选择(根)。其中(
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 q=sessionFactory.getCurrentSession().createQuery(查询);
List employeeSigninList=q.getResultList();

我已实施以下解决方案来解决此问题

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();
final-CriteriaBuilder-CriteriaBuilder=session.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=criteriaBuilder.createQuery(ProductMapping.class);
Root=criteriaQuery.from(ProductMapping.class);
criteriaQuery.select(根目录)。其中(
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 productList=(List)sqlResult.getResultList();
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();