Я написал запрос Postgres, как показано ниже, и он не работает при сборке. Как это реализовать в Spring-boot Hibernate?
@Query(value = "SELECT t from CatalogView t WHERE t.locations=:locations AND STRING_TO_ARRAY(t.myColumn, ',') @> STRING_TO_ARRAY(:myColumn, ',')")
public Set<TrainerGuides> getData(@Param("locations") String locations,@Param("myColumn") String myColumn);
Зачем я это написал? для сравнения набора строк, разделенных запятой, с вводом строки unorder в Postgres.
catalog
----------------------------------
id title keywords
----------------------------------
1 Title-1 k2,k1,k3,k4,k5
2 Title-2 k1,k3,k5,k6
Чтобы выбрать строки, сравнивая ключевые слова с моими входными k1, k2, k5
В этом примере должна появиться строка с id: 1.
SELECT *
FROM catalog
WHERE STRING_TO_ARRAY(keywords, ',') @> STRING_TO_ARRAY('k1,k2,k5', ',')
Указывает ли @Query на собственный запрос? Вы не сможете использовать специальные функции и операторы СУБД в HQL или JPQL.
вы должны установить nativeQuery = true внутри @Query ()
@DHARMENDRASINGH Я могу это построить. Надеюсь, ожидаемые результаты появятся сейчас. Спасибо



вы можете расширить Hibernate Postgresql Dialect и добавить собственные функции базы данных в свой HQL, вот пример:
Я никогда не использовал STRING_TO_ARRAY, но остальное работает нормально.
public class PostgreSQLDialect extends org.hibernate.dialect.PostgreSQLDialect
{
public PostgreSQLDialect()
{
super();
registerFunction("replace", new StandardSQLFunction("replace", Hibernate.STRING));
registerHibernateType(Types.ARRAY, "array");
registerFunction( "string_agg", new StandardSQLFunction("string_agg", Hibernate.STRING) );
registerFunction( "generate_series", new StandardSQLFunction("generate_series") );
registerFunction( "STRING_TO_ARRAY", new StandardSQLFunction("STRING_TO_ARRAY", Hibernate.STRING) );
}
@Override
public boolean supportsTupleDistinctCounts()
{
return true;
}
}
Имена идентификаторов, такие как таблицы, столбцы, функции, не могут быть вставлены с использованием параметров. Это мера безопасности.