包含LIKE的JPQL查询转换为条件

时间:2013-10-03 07:19:57

标签: java oracle hibernate jpa criteria

我需要将 LIKE 运算符用于JPA查询。我需要将它用于除String之外的类型,但JPA条件API允许我只添加String参数。我尝试使用.as(String.class),但有些内容失败,并尝试从基础CAST调用Oracle函数,但由于未知原因再次失败。

我尝试在JPQL中编写查询,它按预期工作。这是查询:

SELECT p from CustomerOrder p where p.id like '%62%'

更新

查询必须以通用方式构建,就像过滤一样,因此需要在运行时创建。在已创建的查询中,我尝试添加 LIKE 子句,如下所示:

query.where(builder.like(selectAttributePath.as(String.class), "%"+filterValue.toString().toLowerCase()+"%"));

但是这个例外崩溃了:

org.hibernate.hql.internal.ast.QuerySyntaxException: expecting CLOSE, found '(' near line 1, column 156 [select distinct generatedAlias0.id from de.brueckner.mms.proddetailschedact.data.CustomerOrder as generatedAlias0 where cast(generatedAlias0.id as varchar2(255 char)) like :param0]

我使用SQLDeveloper直接向 Oracle 执行了相同的查询,因此从这个角度看它应该是合理的。所以问题是Hibernate就是问题所在。有关如何修复它的任何建议吗?

如何使用JPA Criteria编写此查询?

2 个答案:

答案 0 :(得分:1)

我通过从基础'TO_CHAR'调用Oracle DB函数并使用 LIKE 运算符来修复问题,就像正常的字符串一样。

query.where(builder.like(selectAttributePath.as(String.class), "%" +filterValue.toString().toLowerCase() + "%")

答案 1 :(得分:0)

您可以尝试以下代码,可能需要修改。

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<CustomerOrder> cq = cb.createQuery(CustomerOrder.class);
Root<CustomerOrder> order = cq.from(CustomerOrder.class);
cq.where(cb.like(Long.valueOf(order.get(CustomerOrder_.id)).toString(), "%62%"));

TypedQuery<CustomerOrder> q = em.createQuery(cq);
List<CustomerOrder> results = q.getResultList();