0

我们正在处理核心 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 数据库一起正常工作以解析和执行查询。

生成的一些查询示例是:

  • 从 ownername.City 中选择 City.CityName
  • 从城市中选择 City.CityName
  • 从 ownername.City 中选择 CityName
  • 从城市中选择 CityName
  • 从 ownername.City 中选择 ownername.City.CityName
  • 从所有者名称中选择“城市”。“城市名称”。“城市”
  • select * from ownername.City

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

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

我们如何使用带有 SYBASE 数据库的元模型执行查询,或者有没有其他方法可以执行 sybase 查询?

4

2 回答 2

2

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

完整的查询语法和信息可以在文档中 Transact SQL 用户指南的查询部分找到。

于 2016-01-28T13:52:16.680 回答
0

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

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

于 2016-02-02T09:57:34.893 回答