首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Hibernate :如何使用条件查询从组合键获取记录

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

Stack Overflow用户
提问于 2013-09-05 18:31:44
回答 4查看 10K关注 0票数 2

我已经在hbm文件中添加了复合文件,如下所示

代码语言:javascript
复制
<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>

现在我想按如下方式查询

代码语言:javascript
复制
select * from EmployeeSignin where emp_id='12345' and signin_date > 'some initial date' and signin_date<= 'some last date'

我不明白如何才能实现同样的效果,因为有一个组合键,它引用了EmployeeSignId。这种情况下如何创建条件查询?

我在下面尝试过,但没有得到任何记录

代码语言:javascript
复制
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();
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-09-05 18:50:46

问题解决了。

我在下面试过了,它起作用了

代码语言:javascript
复制
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));
票数 4
EN

Stack Overflow用户

发布于 2015-10-26 18:27:44

Criteria query还提供了直接在primaryId上添加标准的功能,例如

代码语言:javascript
复制
Criteria criteria = session.createCriteria("the class you want to fetch");
criteria.add(Restrictions.idEq("The primary id"));

现在这个组合键的主Id是一个java对象,那么我们可以直接使用它吗?是的,如果我们在组合键对象中正确定义了equals()和hashCode()函数,并且代码如下所示,我们就可以做到:

代码语言:javascript
复制
Criterion attdDateCondition = Restrictions.conjunction()                    
          .add(Restrictions.idEq("id", new CompositeKey("empId", "lastDate", "startDate"));

假设CompositeKey是组合键的java对象,并且它有一个接受三个参数的构造函数,如下所示。我没有使用XML映射做到这一点,因此不知道如何在xml中定义equals和hashCode函数。

谢谢

票数 0
EN

Stack Overflow用户

发布于 2018-07-30 02:17:55

对于Hibernate jpa 2.1和更高版本使用

代码语言:javascript
复制
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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18633941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档