我们正在使用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'
答案 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;适配器)。