Как написать запрос выбора HQL с использованием функции extractvalue в предложении select в Java? - PullRequest
1 голос
/ 06 февраля 2020

Я пишу код в спящем режиме, в котором я должен использовать функцию MySQL extractvalue в предложении 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 дБ, но не через Java:

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

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

Извлечение-аннотация HQL будет выбором, только если вы должны использовать извлеченное значение в вашем приложении. Если вы хотите использовать как извлеченное значение, так и необработанные данные, тогда это решение не будет работать. Нам пришлось использовать как извлеченное значение, так и необработанное значение, поэтому нам пришлось поместить отдельные логики c в извлеченное необработанное значение в коде Java, чтобы извлечь необходимое значение отдельно.

0 голосов
/ 08 февраля 2020

У меня не установлена ​​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));
   }
}
Тогда вы должны объявить этот диалект в своем весеннем ботинке application.properties:
spring.jpa.properties.hibernate.dialect=com.app.MyMariaDBDialect
И теперь вы можете использовать эту функцию:
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);
}
...