基于每个查询定义排序规则

时间:2018-05-23 19:51:01

标签: apache-cayenne

我们正在使用Apache Cayenne将现有的MS SQL Server数据库与我们的应用程序集成(我有无权限来更改数据库DDL,包括表/模式/数据库排序规则)。 / p>

数据库正在使用特定的排序规则(克罗地亚语),它定义了单个字符,如“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'

1 个答案:

答案 0 :(得分:1)

您可以尝试将自定义数据库适配器与自定义SQL转换器一起使用,该转换器会将所需部分附加到所有选择查询。 可以像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中设置它(数据节点 - &gt;适配器)。