Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 包含已转换为条件的LIKE的JPQL查询_Java_Oracle_Hibernate_Jpa_Criteria - Fatal编程技术网

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

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%' 更新: 查询必须以通用方式构建,因为它是用于过滤的,所以需要在运行

我需要在JPA查询中使用LIKE操作符。我需要将其用于除字符串以外的其他类型,但JPA criteria API允许我只添加字符串参数。我尝试使用
.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还是其他东西