在每个查询的基础上定义排序规则

Define collation on a per query basis

我们正在使用 Apache Cayenne 将现有的 MS SQL 服务器数据库与我们的应用程序集成(我 无权 更改数据库 DDL,包括table/schema/database整理)。

数据库使用特定的排序规则(克罗地亚语)定义单个字符,如 "nj" 和 "dž",所以当我执行 LIKE 查询时:

select * from table where name like '%N%'
另一方面,我得到零结果如果我这样做:
select * from table where name like '%NJ%'
我得到多个结果。

显然,通过在查询末尾添加 collate 很容易解决这个问题,但我不知道用 Cayenne 无法做到这一点。有什么方法可以在不放弃整个 ORM 优势的情况下实现这一点?

tl;dr: 有没有办法在进入数据库之前预处理查询,像这样:

query = query + ' collate SQL_Latin1_General_CP1_CI_AS'

您可以尝试将自定义 DB 适配器与自定义 SQL 转换器一起使用,这会将所需部分附加到所有 select 查询。 对于 Cayenne 可以这样实现 4.0:

public class CustomSQLServerAdapter extends SQLServerAdapter {

    public CustomSQLServerAdapter(/* all params */) {
        super(/* all params */);
    }

    @Override
    public SelectTranslator getSelectTranslator(SelectQuery<?> query, EntityResolver entityResolver) {
        return new SQLServerSelectTranslator(query, this, entityResolver) {
            @Override
            protected void doTranslate() {
                super.doTranslate();
                sql += " collate SQL_Latin1_General_CP1_CI_AS";
            }
        };
    }
}

要使用此适配器,您可以为其提供自定义检测器 (see docs) 或直接在 Modeler 中设置它(数据节点 -> 适配器)。