【问题标题】:JPA 2 Criteria API using metamodel case sensitive condition使用元模型区分大小写条件的 JPA 2 Criteria API
【发布时间】:2013-01-15 08:47:06
【问题描述】:

我有以下代码行,可以使用 Hibernate 4 API 根据 like 语句获取结果

Predicate predicate = cb.like(emp.get(EmployeeDetail_.empName),
                empName+"%");

生成的sql语句为

 select employeede0_.EMPLOYEE_NAME as EMPLOYEE1_0_ from EMPLOYEES employeede0_ 
        where employeede0_.EMPLOYEE_NAME like 'smith%'

如何修改我的 java 代码以使 EMPLOYEE_NAME 为小写?生成的sql输出应该是这样的

select employeede0_.EMPLOYEE_NAME as EMPLOYEE1_0_ from EMPLOYEES employeede0_ 
    where lower(employeede0_.EMPLOYEE_NAME) like lower('smith%')

获取结果的完整代码

   CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<Employee> c = cb.createQuery(Employee.class);
        Root<Employee> emp = c.from(Employee.class);
        c.select(emp);
        List<Predicate> criteria = new ArrayList<Predicate>();
        ParameterExpression<String> pexp = cb.parameter(String.class,
                "empName");
        Predicate predicate = cb.like(emp.get(Employee_.empName),
                empName+"%");
        criteria.add(predicate);

        if (criteria.size() == 1) {
            c.where(criteria.get(0));
        } else if (criteria.size() > 1) {
            c.where(cb.and(criteria.toArray(new Predicate[0])));
        }
        TypedQuery<EmployeeDetail> q = entityManager.createQuery(c);
        data.setResult(q.getResultList());

【问题讨论】:

    标签: java hibernate jpa criteria-api


    【解决方案1】:

    使用CriteriaBuilder#lower():

    Predicate predicate = cb.like(cb.lower(emp.get(EmployeeDetail_.empName)),
                empName.toLowerCase() + "%");
    

    【讨论】:

    • 由于某种奇怪的原因,执行此操作时没有结果。生成的sql为select employeede0_.EMP_NAME as LONG2_0_ from V_EMPLOYEE employeede0_ where low er(employeede0_.EMP_NAME) like ?
    • 查询似乎是正确的......也许问题出在其他地方?参数empName的值是多少?
    • empName 的值是正确的,例如值以'smith' 的形式出现
    • 我发现了一件很奇怪的事情,System.out.println(" size "+q.getResultList().size());。这会打印 sql 结果的实际计数,但是在 jsf 页面中看不到任何记录。
    • 太棒了。确保查询返回正确的结果集。如果是,请在新问题中添加相关信息提出新问题。
    猜你喜欢
    • 2013-06-21
    • 2020-12-14
    • 2019-04-18
    • 2017-09-29
    • 2018-02-26
    • 2012-01-06
    • 2012-06-17
    • 1970-01-01
    • 2017-06-26
    相关资源
    最近更新 更多