将整个 where 子句传递给本机 spring jpa @Query

sha*_*ley 4 java spring-data-jpa

目前,在我的 spring @Query 中创建本机 SQL 时,我无法知道 SQL where 子句中的字段(认为是临时的)。因此我传递了整个 where 子句。

如果我将 SQL 输出到控制台并将其粘贴到我的 SQL 编辑器中,我就能够收到有效的结果集。

SELECT * FROM lorder WHERE order_id = 1196077
Run Code Online (Sandbox Code Playgroud)

控制台的最后一个 SQL 输出是:Hibernate:

/* dynamic native SQL query */ SELECT
    * 
FROM
    lorder 
WHERE
    ?
and the where clause value being passed in to the @query is:
order_id = 1196077
Run Code Online (Sandbox Code Playgroud)

这就是我目前正在做的事情,但不起作用。

@Query(
    value = "SELECT * FROM lorder WHERE :where",
    nativeQuery = true)
List<OrderEntity> listSelected(@Param("where") String where);  
Run Code Online (Sandbox Code Playgroud)

不确定是否可以传递整个 where 子句,但我期待一个列表。然而我目前得到的是一个空的集合。

hc_*_*dev 6

由于使用@Query注释,您只能使用特定 Java 类型的命名参数(您的:where)或序数参数(例如?1?2),因此不可能注入部分 SQL 表达式。

但是,您可以使用TypedQuery将部分 SQL 添加到查询中:

  public List<OrderEntity> getOrdersUsingWhereClause(EntityManager em, String whereClause) {
    TypedQuery<OrderEntity> query = em.createQuery(
        "SELECT o FROM lorders o WHERE " + whereClause,
        OrderEntity.class);
    return query.getResultList();
  }
Run Code Online (Sandbox Code Playgroud)

请参阅https://www.objectdb.com/java/jpa/query/parameter#Parameters_vs。文字