在每个查询的基础上定义排序规则
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 中设置它(数据节点 -> 适配器)。
我们正在使用 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 中设置它(数据节点 -> 适配器)。