I have a similar function. Would there be any interest in adding something like this to Cayenne?
John On Mon, Nov 14, 2011 at 6:01 AM, Andrus Adamchik <and...@objectstyle.org>wrote: > You can get DataDomain directly from ServerRuntime: > > DataDomain domain = runtime.getDataDomain(); > > even better - you can get direct access to DataSource: > > DataSource ds = runtime.getDataSource("mynodename"); > > So in 3.1 with DI various stack objects are a bit closer to your > application. > > Andrus > > On Nov 14, 2011, at 2:55 PM, Marco Gattei wrote: > > > Hi everyone.... > > > > i'm tryng to write a translator from implementing select count(*) > from a Select Query with an Expression built at runtime via > ExpressionFactory. > > > > In cayenne 2.0 i was using something like: > > > > static class CountTranslator extends SelectTranslator { > > > > @Override > > > > public String createSqlString() throws Exception { > > > > String sql = super.createSqlString(); > > > > int index = sql.indexOf(" FROM "); > > > > return "SELECT COUNT(*)" + sql.substring(index); > > > > } > > > > } > > > > public int count(SelectQuery query, > > > > DataNode node) { > > > > CountTranslator translator = new CountTranslator(); > > > > translator.setQuery(query); > > > > translator.setAdapter(node.getAdapter()); > > > > > > translator.setEntityResolver(DataContext.getThreadDataContext().getEntityResolver()); > > > > > > > > > > Connection con = null; > > > > PreparedStatement stmt = null; > > > > try { > > > > con = node.getDataSource().getConnection(); > > > > translator.setConnection(con); > > > > stmt = translator.createStatement(); > > > > ResultSet rs = stmt.executeQuery(); > > > > if (rs.next()) { > > > > return rs.getInt(1); > > > > } > > > > throw new org.apache.cayenne.CayenneRuntimeException("Count > query returned no result"); > > > > } catch (Exception e) { > > > > throw new CayenneRuntimeException("Cannot count", e); > > > > } finally { > > > > try { > > > > if (stmt != null) { > > > > stmt.close(); > > > > } > > > > if (con != null) { > > > > con.close(); > > > > } > > > > } catch (Exception ex) { > > > > throw new CayenneRuntimeException("Cannot close > connection", ex); > > > > } > > > > } > > > > } > > > > > > > > the only thing i nedeed was to get the current connection from the > context which i did using something like > > > > > > DataContext.getThreadDataContext().getParentDataDomain().getDataNodes().iterator().next() > > > > > > but now in Cayenne 3.1 this method seems to be invalid 'cause i cannot > get ParentDataDomain from ObjectContext. > > Besides that this works only if have a datanode set for the domain. > > Is there any other or better way to proceed? > > > > Thanks, Marco > > > > > > > > > >