lari4
@lari4
ECM Solutions Specialist

Как составить Full-Text HQL-запрос, содержащий SQL contains?

Нужно через веб-сервис искать по полнотекстовому полю. HQL не поддерживает SQL предикаты Contains и ContainsTable.
Примерно вот такой SQL запрос преобразовать в HQL:
select * from test_docs where Contains(xxtext,'Boaz')
  • Вопрос задан
  • 2749 просмотров
Решения вопроса 1
lari4
@lari4 Автор вопроса
ECM Solutions Specialist
Проблема решилась так.

Создаем SQL-функцию:
USE [dbName]
GO
/****** Object:  UserDefinedFunction [dbo].[funcFullText]    Script Date: 11/27/2014 1:12:11 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date, ,>
-- Description: <Description, ,>
-- =============================================
ALTER FUNCTION [dbo].[funcFullText] 
(
     -- Add the parameters for the function here
     @query varchar (250),  @ID varchar (45)
)
RETURNS BIT
AS
BEGIN
     -- Declare the return variable here
     DECLARE @Result BIT
     DECLARE @SQL INT
     select @SQL = count(*) from test_docs where Contains(xxtext,@query) and SYSROWID = @ID
     IF @SQL > 0 SET @Result = 1    ELSE SET @Result = 0
     -- Return the result of the function
     RETURN @Result
END

Внутри функции отрабатывает SQL-запрос, содержащий Contains.

Далее формируем HQL-запрос и вызываем метод веб-сервиса:
hql = " from test_docs where dbo.funcFullText('" + txtSqlQuery.Text + "',SYSROWID) = true";
saWsPropertyValueArray[] result = archiveService.search(token, hql);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@bobzer
Java EE Developer
Hibernate прекрасно работает с SQL, сделайте так:
Query query = session.createSQLQuery("select * from test_docs where Contains(xxtext,'Boaz')")
.addEntity(TestDoc.class);

Если работаете через EntityManager, то там есть createNativeQuery()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы