У меня есть проект загрузки Spring с hibernate 5.4.12, Java 11 и Postgres.
Я пытаюсь создать собственный механизм сортировки / фильтрации с использованием JPA и Querydsl, здесь - это один блог для справки.
У нас есть столбец индекса джина, который используется для функции полнотекстового поиска по postgres. В репозитории jpa я могу легко запросить столбец, как показано ниже
@Query(value = "select * from products where query_token @@ plainto_tsquery(:query)", nativeQuery = true)
Page<Product> findAllByTextSearch(@Param("query") String query, Pageable pageable);
Я знаю, что запросы fts еще не поддерживаются критериями JPA или API querydsl (я могу ошибаться). Поскольку обычная фильтрация logi c будет go через API критериев, как добавить возможности fts в API критериев? Есть ли способ добавить собственный собственный запрос в качестве предиката или StringPath или любых других путей Qtype?
UPDATE
My SearchPredicate
class
public class SearchPredicate<E extends Enum<E>> {
private SearchCriteria<E> searchCriteria;
public <T> BooleanExpression getPredicate(Class<T> entityClass, String entityName) {
PathBuilder<T> entityPath = new PathBuilder<>(entityClass, entityName);
switch (searchCriteria.getPathType()) {
case String:
StringPath stringPath = entityPath.getString(searchCriteria.getKey());
return stringPath.eq(searchCriteria.getStringValue());
case Enum:
return entityPath.getEnum(searchCriteria.getKey(), searchCriteria.getEnumClass())
.eq(Enum.valueOf(searchCriteria.getEnumClass(), searchCriteria.getStringValue()));
case Float:
NumberPath<Float> floatPath = entityPath.getNumber(searchCriteria.getKey(), Float.class);
Float floatValue = Float.parseFloat(searchCriteria.getStringValue());
return floatPath.eq(floatValue);
case Integer:
NumberPath<Integer> integerPath = entityPath.getNumber(searchCriteria.getKey(), Integer.class);
Integer integerValue = Integer.parseInt(searchCriteria.getStringValue());
return integerPath.eq(integerValue);
}
return null;
}
}
My SearchCriteria
class
public class SearchCriteria<E extends Enum<E>> {
private String key;
private Object value;
private PathType pathType;
private Class<E> enumClass;
public String getStringValue() {
return value.toString();
}
}
And My PathType
Enum
public enum PathType {
String, Enum, Integer, Float;
}
В этих же строках я предполагаю / ожидаю что-то для текстового поиска, например
case Search:
FtsPath ftsPath = entityPath.getFtsPath("query_token");
return ftsPath.search("some search string")