0

我正在尝试对可以位于任何类型数据库的表进行简单搜索。以下查询适用于大多数数据库,但我找不到适用于 mysql 的解决方案。我的数据库中的表是由活动对象框架生成的,因此我无法更改这些实例的名称或配置。

这是在除 MySQL 之外的所有数据库上都可以正常工作的查询:

select * from "AO_69D057_FILTER" where "SHARED" = true AND "CONTAINS_PROJECT" = true AND UPPER("FILTER_NAME") like UPPER('%pr%')。

由于某种原因,MySql 无法在双引号中使用表名。如果我使用不带引号的表名,它适用于 MySQL,但不适用于 Postgres。Postgres 正在将表名转换为小写,因为它没有被引用。AO 正在生成大写的表名。

我也尝试使用别名,但由于语句的评估层次结构,这不起作用。

任何建议如何摆脱表名问题?

4

2 回答 2

0

默认情况下,双引号用于列。你可以改变它:

设置 SQL_MODE=ANSI_QUOTES;

这是关于它的文档:http: //dev.mysql.com/doc/refman/5.7/en/sql-mode.html

于 2016-07-20T15:57:52.293 回答
0

我有同样的问题。我根据我得到的异常选择查询。在 db 搜索的第一次调用中,如果失败,我尝试不使用引号,然后尝试使用引号。然后我相应地设置 useQueryWithQuotes 变量,以便在以后的调用中我不需要检查异常。下面是我正在使用的代码片段。

private Boolean useQueryWithQuotes=null;
private final String queryWithQuotes = "\"OWNER\"=? or \"PRIVATE\"=?";
private final String queryWithoutQuotes = "OWNER=? or PRIVATE=?";

public Response getReports() {
  List<ReportEntity> reports = null;
  if(useQueryWithQuotes==null){
    synchronized(this){
      try {
        reports = new ArrayList<ReportEntity>( Arrays.asList(ao.find(ReportEntity.class, Query.select().where(queryWithoutQuotes, getUserKey(), false))) );
        useQueryWithQuotes = false;
      } catch (net.java.ao.ActiveObjectsException e) {
        log("exception:" + e);
        log("trying query with quotes");
        reports = new ArrayList<ReportEntity>(  Arrays.asList(ao.find(ReportEntity.class, queryWithQuotes, getUserKey(), false)));
        useQueryWithQuotes = true;
      }
    }
  }else{
    String query = useQueryWithQuotes ? queryWithQuotes : queryWithoutQuotes;
    reports = new ArrayList<ReportEntity>(  Arrays.asList(ao.find(ReportEntity.class, query, getUserKey(), false)));
  }
  ...
}
于 2021-09-22T11:47:11.580 回答