我需要将 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编写此查询?
答案 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();