Sybase DataContext:列前缀与表名或别名不匹配



我们正在处理核心Java代码中的sybase数据库。我们正在使用org.eobjects.metamodel.DataContext来解析查询。

String sCol[]=table.getColumnNames();
Query query=dataContext.query().from(table.getName()).select(sCol).toQuery();
return new QueryIterator(dataContext.executeQuery(query).iterator());

但它执行查询。与 Oracle 数据库配合使用以解析和执行查询的相同代码。

生成的一些查询示例是:

  • 从所有者名称中选择城市.城市名称。城市
  • 从"城市"
  • 中选择"城市"。"城市名称"
  • 从所有者名称中选择城市名称。城市
  • 从城市中选择城市名称
  • 选择"所有者名称"。城市.城市名称来自所有者名称。城市
  • 选择"城市"。城市名称"来自所有者名称。城市"
  • 从所有者名称中选择 *。城市

未执行上述任何查询。我们收到这些错误

  • 无法解析 FROM 令牌:"所有者名称"。城市"
  • 无法执行查询:列前缀"城市"与查询中使用的表名或别名不匹配。该表未在 FROM 子句中指定,或者它具有必须改用的相关名。
  • 无法解析 SELECT 令牌:所有者名称。城市.城市名称

我们如何使用具有 SYBASE 数据库的元模型执行查询,或者是否有任何其他方法来执行 sybase 查询?

Oracle(和Microsoft)使用Sybase ASE不使用的架构逻辑结构。 在 SAP/Sybase ASE 中,数据库中的所有表和列都位于同一架构中。 不过,用户可以在数据库中拥有自己的对象,因此可以使用用户所有权模仿某些架构行为,但这需要额外的努力。

对于Sybase,正确的查询语法是:

SELECT [ Col1, Col2 | * ]
  FROM [dbName].[ownerName.]TABLE

在您的情况下

SELECT CityName
 FROM dbName.ownername.City

在 Sybase ASE 中,最佳做法通常是让所有对象都归"dbo"所有,因此在这种情况下,您可以从查询中省略所有者:

SELECT CityName
 FROM dbName..City

完整的查询语法和信息可以在文档中的《事务处理 SQL 用户指南》的"查询"部分找到。

您收到的错误消息来自MetaModel的查询解析器层。它会在触发查询之前在数据库的元数据中搜索匹配的列名和表名。

我注意到您正在使用命名空间"org.eobjects.metamodel"。如果可能的话,你应该升级到Apache MetaModel("org.apache.metamodel"),因为自从MetaModel被引入Apache以来,它已经得到了很多改进。包括许多查询解析器改进。

最新更新