0

我需要在 JPA 查询中使用LIKE运算符。我需要将它用于除 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]

我直接对Oracle执行了相同的查询执行了相同的查询,所以从这个角度来看应该是合理的。所以问题是Hibernate是问题。关于如何修复它的任何建议?

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

4

2 回答 2

1

我通过'TO_CHAR'从底层调用函数Oracle DB并使用像普通String一样的LIKE运算符解决了这个问题。

query.where(builder.like(selectAttributePath.as(String.class), "%" +filterValue.toString().toLowerCase() + "%")
于 2013-10-03T14:45:45.083 回答
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();
于 2013-10-03T07:40:22.760 回答