2011-10-05 49 views
0

所以我在做的是創建一個獲取ID值列表的子查詢,然後主查詢獲取所有必要的值並添加排序。如何使用getTranslatedSQLString獲取Toplink生成的查詢?

什麼我是這樣的:

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()。現在在我看到的所有示例代碼中,它們或者將行作爲新對象進行實例化,或者不會從他們獲取引用的位置編寫代碼,但無論如何,這不起作用(TopLink版本問題?)。我猜我需要自己填充DatabaseRow對象,但我在網上找不到任何示例。

回答

0

我沒有設法通過使用getTranslatedSQLString找到任何方式來做到這一點。我想DatabaseRow需要填充,但我還沒有找到正確的方法。現在,我正在使用「bruteforce」替換,我「記住」所有參數,並在每個參數上進行查找/替換?登錄查詢。

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()); 

這爲我工作。