Java Specification/Predicate 全文搜索
Full Text Search with Java Specification/Predicate
我正在尝试将字符串与 table 中的每一列进行比较。有没有更简单的方法来做到这一点?
public class MySpec implements Specification<Tbl> {
private Tbl searchCriteria;
public MySpec(Tbl searchCriteria){
this.searchCriteria = searchCriteria;
}
@Override
public Predicate toPredicate(Root<Tbl> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> textPredicates = new ArrayList<>();
String searchText = "%" + searchCriteria.getSearchText() + "%";
textPredicates.add(cb.like(root.get("col1"), searchText));
textPredicates.add(cb.like(root.get("col2"), searchText));
textPredicates.add(cb.like(root.get("col3"), searchText));
textPredicates.add(cb.like(root.get("col4"), searchText));
textPredicates.add(cb.like(root.get("col5"), searchText));
textPredicates.add(cb.like(root.get("col6"), searchText));
textPredicates.add(cb.like(root.get("col7"), searchText));
textPredicates.add(cb.like(root.get("col8"), searchText));
textPredicates.add(cb.like(root.get("col9"), searchText));
return query.where(cb.or(textPredicates.toArray(new Predicate[0])
.distinct(true).getRestriction();
}
}
我不想每次向 table 添加新列时都必须更改规范代码。另一个选项是单独的 table ,它将在字符串中保存每一列的串联版本。如:
TBL
Col1 | Col2 | Col3 | Col4
-----------------------------------------
1 | "Name" | "Value" | "Other Value"
TBL_CACHE
Col1 | Col2
------------------------------
1 | "Name Value OtherValue"
但我不想为每个 table 创建另一个 table 我想进行全文搜索,我不想维护填充此数据或创建 SQL 作业自动完成。
您可以从 CriteriaBuilder 获取 size() 并创建一个循环。这假定该列从 1 开始并以列数结束。
int sz = cb.size();
for (int ii = 1; ii <= sz; ii++) {
String textIndex = "" + ii;
textPredicates.add(cb.like(root.get("col" + textIndex), searchText));
}
让休眠从实体中检索列列表。
String[] columnNames = getSessionFactory().getClassMetadata(Entity.class).getPropertyNames();
对于 JPA,您可以浏览字段列表
for (Field field : entity.getClass().getDeclaredFields()) {
Column column = field.getAnnotation(Column.class);
if (column != null) {
columnNames.add(column.name());
}
}
如果您注释方法,您可以使用相同的方法。
同时勾选 and this。另一种获取元数据的方法。
然后使用列列表循环添加您的条件。
我正在尝试将字符串与 table 中的每一列进行比较。有没有更简单的方法来做到这一点?
public class MySpec implements Specification<Tbl> {
private Tbl searchCriteria;
public MySpec(Tbl searchCriteria){
this.searchCriteria = searchCriteria;
}
@Override
public Predicate toPredicate(Root<Tbl> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> textPredicates = new ArrayList<>();
String searchText = "%" + searchCriteria.getSearchText() + "%";
textPredicates.add(cb.like(root.get("col1"), searchText));
textPredicates.add(cb.like(root.get("col2"), searchText));
textPredicates.add(cb.like(root.get("col3"), searchText));
textPredicates.add(cb.like(root.get("col4"), searchText));
textPredicates.add(cb.like(root.get("col5"), searchText));
textPredicates.add(cb.like(root.get("col6"), searchText));
textPredicates.add(cb.like(root.get("col7"), searchText));
textPredicates.add(cb.like(root.get("col8"), searchText));
textPredicates.add(cb.like(root.get("col9"), searchText));
return query.where(cb.or(textPredicates.toArray(new Predicate[0])
.distinct(true).getRestriction();
}
}
我不想每次向 table 添加新列时都必须更改规范代码。另一个选项是单独的 table ,它将在字符串中保存每一列的串联版本。如:
TBL
Col1 | Col2 | Col3 | Col4
-----------------------------------------
1 | "Name" | "Value" | "Other Value"
TBL_CACHE
Col1 | Col2
------------------------------
1 | "Name Value OtherValue"
但我不想为每个 table 创建另一个 table 我想进行全文搜索,我不想维护填充此数据或创建 SQL 作业自动完成。
您可以从 CriteriaBuilder 获取 size() 并创建一个循环。这假定该列从 1 开始并以列数结束。
int sz = cb.size();
for (int ii = 1; ii <= sz; ii++) {
String textIndex = "" + ii;
textPredicates.add(cb.like(root.get("col" + textIndex), searchText));
}
让休眠从实体中检索列列表。
String[] columnNames = getSessionFactory().getClassMetadata(Entity.class).getPropertyNames();
对于 JPA,您可以浏览字段列表
for (Field field : entity.getClass().getDeclaredFields()) {
Column column = field.getAnnotation(Column.class);
if (column != null) {
columnNames.add(column.name());
}
}
如果您注释方法,您可以使用相同的方法。
同时勾选
然后使用列列表循环添加您的条件。