0

所以我正在做的是创建一个获取 ID 值列表的子查询,然后主查询获取所有必要的值并添加排序。

我所拥有的是:

ReportQuery querySub = new ReportQuery(Predmet.class, generatedExpression);
querySub.addAttribute("m_id");

DatabaseRow row = new DatabaseRow();
querySub.prepareCall(getSession(), row);

// This part is the problem
String sql = querySub.getTranslatedSQLString(getSession(), row);

这段代码的问题是它不返回 TranslatedSQLString,它返回的结果与querySub.getSQLString(). 现在,在我看到的所有示例代码中,他们要么将 row 实例化为新对象,要么不费心从获得引用的位置写入,但无论如何,这不起作用(TopLink 版本问题?)。我猜我需要自己填充 DatabaseRow 对象,但我在网上找不到任何示例。

4

2 回答 2

0

我没有设法通过使用 getTranslatedSQLString 找到任何方法来做到这一点。我想需要填充 DatabaseRow,但我还没有找到正确的方法。现在,我正在使用“bruteforce”替换,我“记住”所有参数并对每个“?”进行查找/替换。登录查询。

于 2011-10-10T12:16:18.067 回答
0

你需要这样的会话:

JpaHelper.getDatabaseSession(getEntityManager().getEntityManagerFactory());

您需要的数据库是:

TypedQuery<T> typedQuery = getEntityManager().createQuery(cq);
DatabaseQuery databaseQuery = typedQuery.unwrap(JpaQuery.class).getDatabaseQuery();

所以最后一个例子是:

Session session = JpaHelper.getDatabaseSession(getEntityManager().getEntityManagerFactory());
DatabaseQuery databaseQuery = null;
if(typedQuery instanceof EJBQueryImpl)
    databaseQuery = ((EJBQueryImpl<T>)typedQuery).getDatabaseQuery();
else
    databaseQuery = typedQuery.unwrap(JpaQuery.class).getDatabaseQuery();
sql = databaseQuery.getTranslatedSQLString(session, databaseQuery.getTranslationRow());

那对我有用。

于 2015-04-24T19:07:40.857 回答