【问题标题】:How to write a HQL select query using extractvalue function in select clause of query in Java?如何在 Java 查询的选择子句中使用 extractvalue 函数编写 HQL 选择查询?
【发布时间】:2020-05-22 09:49:12
【问题描述】:

我正在用 hibernate 编写代码,其中我必须在查询的 SELECT 子句中使用 MySQL extractvalue 函数。但是,我收到错误消息:

java.lang.IllegalArgumentException: org.hibernate.QueryException: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode
 \-[METHOD_CALL] MethodNode: '('
    +-[METHOD_NAME] IdentNode: 'EXTRACTVALUE' {originalText=EXTRACTVALUE}

相应的 MySQL 查询(如下所述)在 MySQL db 中执行时可以正常工作,但不能通过 Java:

SELECT EXTRACTVALUE(XMLRAW_DATA_IN_STRING_FORMAT,'//ns:Id') as ErrorId,
FROM TEMP_TABLE;

【问题讨论】:

  • 你使用什么休眠版本?你使用什么休眠方言?函数extractvalue 应该在休眠方言中声明。如果没有,你应该扩展方言并自己声明这个函数。
  • 我们使用hibernate 5.3.7并且不能在hibernate方言中声明extractvalue,因为有些地方我们确实需要整个数据而不仅仅是提取的值。请建议我如何扩展方言并自行声明此功能?

标签: mysql hibernate spring-boot hql extract-value


【解决方案1】:

我没有安装 MySql 数据库。因此,我将提供以下非常相似的 MariaDB 示例。

  1. 你应该声明你的hibernate方言扩展最适合你现有的方言。它将注册您必须使用的函数extractvalue
import org.hibernate.dialect.MariaDB103Dialect;
import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.type.StandardBasicTypes;

public class MyMariaDBDialect extends MariaDB103Dialect
{
   public MyMariaDBDialect()
   {
      super();
      registerFunction("extractvalue", new StandardSQLFunction("extractvalue", StandardBasicTypes.TEXT));
   }
}
  1. 那你应该在你的spring boot中声明这个方言application.properties
spring.jpa.properties.hibernate.dialect=com.app.MyMariaDBDialect
  1. 现在你可以使用这个函数了:
public interface DataRepository extends JpaRepository<Data, Long>
{
   @Query("select extractvalue(d.data, :path) from Data d where d.id = :id")
   String findDataElement(@Param("id") Long id, @Param("path") String path);
}

【讨论】:

  • 这种方式的问题是过滤后的值会存储在对应类的成员变量中。在某些地方,我们确实需要原始数据的原始值,因此也是问题所在。有没有其他方法可以解决这个问题?
  • 您可以尝试使用休眠@Formula作为基于extractvalue调用计算的值。如果没有帮助,请使用您需要的实体声明和 jpql/hql 更新您的问题。
【解决方案2】:

仅当您必须在应用程序中使用提取值时,才可以选择 HQL 的提取值注释。如果您想同时使用提取的值和原始数据,那么此解决方案将不起作用。 我们必须同时使用提取的值和原始值,因此我们必须在 Java 代码中对提取的原始值添加单独的逻辑,以分别提取所需的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2013-02-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    相关资源
    最近更新 更多