Java 如何针对包含Spring数据的列编写带有LIKE的查询?
我有一个带有文本列和查询的PSQL表Java 如何针对包含Spring数据的列编写带有LIKE的查询?,java,spring-data-jpa,sql-like,Java,Spring Data Jpa,Sql Like,我有一个带有文本列和查询的PSQL表 select * from table where :number: like column||'%'; 其中:编号:是一个参数 如何在SpringDataJPA中编写该查询?类似的Spring数据似乎只接受一个文本参数,而不是列名。这可以使用或。两者都用于创建与引用的列名相对应的路径。我假设您有一个名为Table的实体 标准查询示例: public List<Table> getCoulmnLikeNumber(String columnNa
select * from table where :number: like column||'%';
其中:编号:
是一个参数
如何在SpringDataJPA中编写该查询?类似的Spring数据似乎只接受一个文本参数,而不是列名。这可以使用或。两者都用于创建与引用的列名相对应的路径。我假设您有一个名为Table
的实体
标准查询示例:
public List<Table> getCoulmnLikeNumber(String columnName, String number) {
CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<Table> critQuery = builder.createQuery(Table.class);
Root<Table> root = critQuery.from(Table.class);
Expression<String> pattern = builder.concat(root.<String>get(columnName), "%");
critQuery.select(root)
.where(builder.like(builder.literal(number), pattern));
return getEntityManager()
.createQuery(critQuery)
.getResultList();
}
public List getCoulmnLikeNumber(字符串列名、字符串编号){
CriteriaBuilder=getEntityManager().getCriteriaBuilder();
CriteriaQuery critQuery=builder.createQuery(Table.class);
Root=critQuery.from(Table.class);
表达式模式=builder.concat(root.get(columnName),“%”;
critQuery.select(根目录)
.where(builder.like(builder.literal(number),pattern));
返回getEntityManager()
.createQuery(critQuery)
.getResultList();
}
适用于您的规格的工厂方法可能类似于:
public static Specification<Table> columnNameLikeNumber(String columnName, String number) {
return new Specification<Table>() {
@Override
public Predicate toPredicate(Root<Entity> root,
CriteriaQuery<?> query, CriteriaBuilder builder) {
Expression<String> pattern = builder.concat(root.<String>get(columnName), "%");
return builder.like(builder.literal(number), pattern);
}
};
}
公共静态规范ColumnNameLikumber(字符串columnName,字符串编号){
返回新规范(){
@凌驾
公共谓词toPredicate(根,
CriteriaQuery查询,CriteriaBuilder){
表达式模式=builder.concat(root.get(columnName),“%”;
返回builder.like(builder.literal(number),pattern);
}
};
}
谢谢。但是这个规范生成了一个顺序错误的查询:column |‘%'像'number'
-我需要像column | |‘%'一样的'number'
。如果使用CriteriaBuilder#literal()
包装number
,则可以交换顺序。请参阅我编辑的答案。