Sybase DataContext:列前缀与表名或别名

时间:2016-01-28 07:18:09

标签: java datacontext sybase-ase apache-metamodel

我们正在处理核心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
  • 中选择City.CityName
  • 从ownername.City
  • 中选择CityName
  • 从City选择CityName
  • 从ownername.City
  • 中选择ownername.City.CityName
  • SELECT“City”。“CityName”FROM ownername。“City”
  • 从ownername.City
  • 中选择*

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

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

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

2 个答案:

答案 0 :(得分:1)

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

可以在Query Section of the Transact SQL Users Guide in the documentation.

中找到完整的查询语法和信息

答案 1 :(得分:0)

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

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