我想使用QueryDsl JPA进行Postgres FullText搜索。
在SQL中生成:
select *
from film
where to_tsquery ('tarzan') @@ to_tsvector('french',film.title) = true
让所有影片中都包含tarzan。
在JPA中,我定义了一个自定义函数'ftsMatch',我可以这样使用:
String jpql = "select film from Film film where ftsMatch(:queryString, film.titre) = true";
我是QueryDSL我想有机会在String类型上定义一个谓词:
QFilm.film.titre.ftsMatch('tarzan')
我还没有找到任何解决方案
答案 0 :(得分:1)
我想做的是扩展com.querydsl.core.types.dsl.StringExpression.class 并添加一个自定义函数fullTextMatch(),可以像:
一样使用return view('home);
它会变成SQL:
BooleanBuilder booleanBuilder = new BooleanBuilder(QFilm.film.titre.fullTextMatch(_titre, "french"));
我还没有找到如何获得上面的QueryDSL语法,但找到了以下解决方案:
1 /为Postgres定义自定义方言 并在这个方言上注册Customm功能:
select film0_.id as id1_2_ .. from film film0_
where to_tsquery (?) @@ to_tsvector('pg_catalog.french',film0_.titre)=true
2 /编写实现org.hibernate.dialect.function.SQLFunction的自定义函数PostgreSQLFullTextSearchFunction 这个功能' ftsMacth'将生成SQL:
public class CustomFullTextPostgresDialect extends PostgreSQL94Dialect {
public CustomFullTextPostgresDialect() {
registerFunction("ftsMatch", new PostgreSQLFullTextSearchFunction());
}
}
此步骤允许我访问JPA中的Posgres FullText:
String fragment = " to_tsquery (" + value + ") @@ to_tsvector(" + ftsConfig + "," + field + ")";
3 /使用QueryDsl中继到扩展postgres方言中定义的自定义函数:
String jpql = "select film from Film film "
+ "where FUNCTION( 'ftsMatch', :titre,'pg_catalog.french', film.titre) = true";
TypedQuery<Film> typedQuery = em.createQuery(jpql, Film.class);
typedQuery.setParameter("titre", _titre);
List<Film> list = typedQuery.getResultList();
但是使用这个QueryDSL解决方案,我仍然需要Hibernate自定义。语法不再是面向DSL的