【问题标题】:Fetch records which columns as rows using hibernate criteria使用休眠条件获取记录作为行的列
【发布时间】:2018-09-26 23:37:24
【问题描述】:

我有一个以列为行的表格。

现在我想用“and”条件对多行应用限制。我们如何使用休眠条件来做到这一点?

示例:Employee

Pk  ColumnName.   Value
------------------------
1.  Empid.        10
1   EmpName.      Sachin
1.  Empsalary.    10,000
2   Empid.        20
2   EmpName.      Dhoni
2.  Empsalary.    8000

现在我想获取 EmpName 为 sachin 和 empsal 为 10,000 的 pk

所以它应该返回 pk 为 1。

请查看附件图片

【问题讨论】:

    标签: java spring oracle hibernate hibernate-criteria


    【解决方案1】:

    您可以使用条件查询从数据库中获取数据的主键列表。按照下面的代码sn-p:

    EntityManager enm = sessFact.createEntityManager();
        CriteriaBuilder en = sessFact.getCriteriaBuilder();
        CriteriaQuery<Integer> qu = en.createQuery(Integer.class);
        Root<Employee> ro = qu.from(Employee.class);
        qu.select(ro.get("id"));
        qu.where(en.like(ro.get("empName"), "Sachin%"), en.equal(ro.get("empSalary"), 10000 ));
        List<Integer> list= enm.createQuery(qu).getResultList();
        for (Integer name : list) {
           System.out.println("PK: " + name);
        }
    

    在 where 子句中,您可以删除 "%" 并给出准确的搜索,例如 qu.where(en.like(ro.get("empName"), "Sachin"), en.equal(ro.get("empSalary"), 10000 ));

    hibernate生成的等效SQL日志如下:

    休眠:从员工employee0_ where (employee0_.emp_name like ?) andemployee0_.emp_salary=10000 中选择employee0_.id as col_0_0_

    仅供参考,引用的数据库表结构如下:

    创建表 employee (
    id int(11) NOT NULL AUTO_INCREMENT,
    emp_name varchar(100) 默认为 NULL,
    emp_address varchar(500) 默认为 NULL,emp_mobile_nos varchar(100) 默认为空, emp_salary int(12) 默认为空,
    主键 (id)
    ) ENGINE=InnoDB 默认字符集=latin1;

    请在此处找到与 GIT 中 Hibernate 相关的完整代码 - https://github.com/ctmithun/HibernateExample/blob/master/Hibernate5Annotation/src/net/roseindia/GetAllData.java

    【讨论】:

    • 能否请您分享上述代码的等效sql
    • 用简单的标准我们不能这样做吗?请分享sql
    • 我相信这很简单,它只有 4 行代码。生成的SQL:select employee0_.id as col_0_0_ from employee employee0_ where (employee0_.emp_name like ?) and employee0_.emp_salary=10000;
    • EmpName 不是员工类中的属性
    • 抱歉,我没有让您提出问题“EmpName 不是员工类中的属性”,您能详细说明一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 2012-07-22
    • 2014-12-17
    • 2014-11-08
    相关资源
    最近更新 更多