SQLJ生成了无效的Java代码

时间:2011-03-09 04:46:52

标签: java sqlj

虽然我是该网站的老用户,但之前设法解决了问题。这次我需要你的建议:)

情况: 我继承了旧的Java项目代码,其中SQLJ用于数据库访问。项目中既不需要数据库也不需要SQLJ,但我无法更改历史记录,因此必须使用它。故事的另一部分是开发工作之前在JDeveloper中完成,但是新的公司标准要求Eclipse(在我的偏好中是更好的产品)。

但是我使用javac而不是Oracle编译器迁移SQLJ以使用Ant自动构建时遇到了问题。所以这就出现了问题:

由于Package结构的不同,SQLJ生成的Java文件对javac编译器无效。但是,JDeveloper(11.1.1.0.2)接受此类java文件,只要它使用旧的oracle编译器。 sqlj和Java的例子更好地解释了这个问题:

SQLJ

package Sess;
public class UserDB extends Object implements SessConstants
{
    #sql public static iterator  UserIterator(
         String              m
<cut off>
      );
<cut off>

private static UserIterator   UserIter  = null;
}

public static boolean readNext(User theUser )
  throws SQLException
  {
    if (iteratorOpen == false)
    {
     #sql UserIter = {
        select
          m
          <cut off>
   from
          <cut off>
  };

  iteratorOpen = true;
  <cut off>

生成的JAVA:

package Sess;
public class UserDB extends Object implements SessConstants
{
public static class UserIterator
extends sqlj.runtime.ref.ResultSetIterImpl
implements sqlj.runtime.NamedIterator
<cut off>
public static boolean readNext(User theUser )
throws SQLException
{
if (iteratorOpen == false)
{
<cut off>

{
<cut off>

UserIter = new Sess.UserDB.UserIterator(new 
...
<cut off>

问题在于最后一句话

UserIter = new Sess.UserDB.UserIterator(new     ...

实际应该是:

UserIter = new UserDB.UserIterator(new 

然后就可以了。

请注意,较新版本的JDeveloper与使用javac(我相信)的问题相同。

作为一种解决方法,我们将Java文件与SQLJ一起存储,在我们从SQLJ中重新生成java后,我们再次修复Java。手动执行这些操作并不十分乐意,因为当需要更新SQLJ时,它会使自动构建过程无效。

任何人都有任何想法?非常感谢您的帮助:)

干杯

1 个答案:

答案 0 :(得分:0)

嗯,虽然这是合理的,但我没有多少回应 - 主题是罕见的。我发现自己也不多。看起来ant和sqlj存在一个需要克服的问题。

事实上,我们必须跟上原始的解决方法。即我们编译sqlj,然后手动修改文件(脚本),然后编译它。丑陋但有效。