Java 包含已转换为条件的LIKE的JPQL查询
我需要在JPA查询中使用LIKE操作符。我需要将其用于除字符串以外的其他类型,但JPA criteria API允许我只添加字符串参数。我尝试使用Java 包含已转换为条件的LIKE的JPQL查询,java,oracle,hibernate,jpa,criteria,Java,Oracle,Hibernate,Jpa,Criteria,我需要在JPA查询中使用LIKE操作符。我需要将其用于除字符串以外的其他类型,但JPA criteria API允许我只添加字符串参数。我尝试使用.as(String.class)但出现了一些问题,还尝试从底层Oracle调用CAST函数,但由于未知原因再次失败 我也试着用JPQL编写查询,结果正如预期的那样。以下是查询: SELECT p from CustomerOrder p where p.id like '%62%' 更新: 查询必须以通用方式构建,因为它是用于过滤的,所以需要在运行
.as(String.class)
但出现了一些问题,还尝试从底层Oracle
调用CAST
函数,但由于未知原因再次失败
我也试着用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执行了相同的查询,因此从这个角度来看应该是合理的。所以问题在于休眠是个问题。对如何修复它有什么建议吗
如何使用JPA标准编写此查询?您可以尝试以下代码,它可能需要修改
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();
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(CustomerOrder.class);
根订单=cq.from(CustomerOrder.class);
cq.where(cb.like(Long.valueOf(order.get(CustomerOrder_u2;id)).toString(),“%62%”);
TypedQuery q=em.createQuery(cq);
List results=q.getResultList();
我通过从底层的Oracle DB
调用'TO_CHAR'
函数,并对正常的字符串使用LIKE操作符解决了这个问题
query.where(builder.like(selectAttributePath.as(String.class), "%" +filterValue.toString().toLowerCase() + "%")
已经这样做了,代码没有编译:找不到“like(Expression x,Expression pattern)”方法。方法签名是:'like(Expression x,Expression pattern)'@user503413您是否尝试过显式强制转换它,比如
Long.valueOf(id).toString()
。这可能会奏效,但是这个主题是一个更广泛主题的一部分,因此标准是以通用方式构建的,因此我并不总是知道它是ID还是其他东西