1

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

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;
4

2 回答 2

0

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

  1. 你应该声明你的休眠方言,它扩展了最适合你存在的方言。它将注册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);
}
于 2020-02-08T12:19:50.960 回答
0

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

于 2020-03-09T13:07:48.563 回答