Java 如何针对包含Spring数据的列编写带有LIKE的查询?

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

我有一个带有文本列和查询的PSQL表

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
,则可以交换顺序。请参阅我编辑的答案。