You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求SQLAlchemy中LIKE ALL的ORM等效实现方案

实现 LIKE ALL 的 ORM 写法

针对你需要替代原生SQL中LIKE ALL(array[...])的需求,以下是几种主流ORM的实现方式:

JPA/Hibernate(Java)

方式1:Criteria API 调用数据库函数

利用CriteriaBuilder.function直接调用PostgreSQL的like_all函数:

List<String> patterns = Arrays.asList("%par1%", "%par2%", "%par3%");
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<OutboxDocument> query = cb.createQuery(OutboxDocument.class);
Root<OutboxDocument> root = query.from(OutboxDocument.class);

Expression<Boolean> likeAllCondition = cb.function(
    "like_all",
    Boolean.class,
    root.get("documentSummary"),
    cb.array(patterns.toArray(new String[0]))
);

query.select(root).where(likeAllCondition);
List<OutboxDocument> result = entityManager.createQuery(query).getResultList();

方式2:HQL 自定义函数调用

SELECT od FROM OutboxDocument od WHERE function('like_all', od.documentSummary, :patterns) = true

绑定参数执行:

Query<OutboxDocument> hqlQuery = entityManager.createQuery(hql, OutboxDocument.class);
hqlQuery.setParameter("patterns", patterns.toArray(new String[0]));
List<OutboxDocument> result = hqlQuery.getResultList();

SQLAlchemy(Python)

直接通过func调用PostgreSQL的like_all函数,结合PostgreSQL数组类型:

from sqlalchemy import func, select
from sqlalchemy.dialects.postgresql import array
from your_models import OutboxDocument

patterns = ["%par1%", "%par2%", "%par3%"]
query = select(OutboxDocument).where(
    func.like_all(OutboxDocument.document_summary, array(patterns))
)

result = session.execute(query).scalars().all()

Entity Framework Core(.NET)

方式1:通用等价写法(不依赖特定数据库)

用All结合EF.Functions.Like生成多个LIKE条件的AND连接,效果与LIKE ALL一致:

var patterns = new List<string> { "%par1%", "%par2%", "%par3%" };
var result = dbContext.OutboxDocuments
    .Where(od => patterns.All(p => EF.Functions.Like(od.DocumentSummary, p)))
    .ToList();

方式2:调用PostgreSQL原生函数

先注册数据库函数:

public class YourDbContext : DbContext
{
    [DbFunction("like_all", Schema = "public")]
    public static bool LikeAll(string column, string[] patterns)
    {
        throw new NotImplementedException("仅用于EF Core查询翻译");
    }

    // DbSet定义
    public DbSet<OutboxDocument> OutboxDocuments { get; set; }
}

然后执行查询:

var result = dbContext.OutboxDocuments
    .Where(od => YourDbContext.LikeAll(od.DocumentSummary, patterns.ToArray()))
    .ToList();

补充说明

如果你的ORM不支持直接调用like_all函数,用多个LIKE条件通过AND连接是通用方案,逻辑上完全等价于LIKE ALL,且兼容性更好。

内容的提问来源于stack exchange,提问作者UselessAqua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:59:05