求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
相关产品推荐
相关产品推荐

