@Test public void testImplicitTupleNotEquals() { final String hql = "from TheEntity e where e.compositeValue <> :p1"; HQLQueryPlan queryPlan = ( (SessionFactoryImplementor) sessionFactory ).getQueryPlanCache() .getHQLQueryPlan( hql, false, Collections.<String,Filter>emptyMap() ); assertEquals( 1, queryPlan.getSqlStrings().length ); System.out.println( " SQL : " + queryPlan.getSqlStrings()[0] ); assertTrue( queryPlan.getSqlStrings()[0].contains( "<>" ) ); }
@Test public void testImplicitTupleNotInList() { final String hql = "from TheEntity e where e.compositeValue not in (:p1,:p2)"; HQLQueryPlan queryPlan = ( (SessionFactoryImplementor) sessionFactory ).getQueryPlanCache() .getHQLQueryPlan( hql, false, Collections.<String,Filter>emptyMap() ); assertEquals( 1, queryPlan.getSqlStrings().length ); System.out.println( " SQL : " + queryPlan.getSqlStrings()[0] ); assertTrue( queryPlan.getSqlStrings()[0].contains( "<>" ) ); }
@Override public String getSql(EntityManager em, Query query) { SessionImplementor session = em.unwrap(SessionImplementor.class); HQLQueryPlan queryPlan = getOriginalQueryPlan(session, query); if (queryPlan.getTranslators().length > 1) { throw new IllegalArgumentException("No support for multiple translators yet!"); } QueryTranslator queryTranslator = queryPlan.getTranslators()[0]; String[] sqls; if (queryTranslator.isManipulationStatement()) { StatementExecutor executor = getStatementExecutor(queryTranslator); if (!(executor instanceof BasicExecutor)) { throw new IllegalArgumentException("Using polymorphic deletes/updates with CTEs is not yet supported"); } sqls = executor.getSqlStatements(); } else { sqls = queryPlan.getSqlStrings(); } // TODO: have to handle multiple sql strings which happens when having e.g. a polymorphic UPDATE/DELETE for (int i = 0; i < sqls.length; i++) { if (sqls[i] != null) { return sqls[i]; } } return null; }
String exampleQuerySql = queryPlan.getSqlStrings()[0]; String[][] returningColumns = getReturningColumns(caseInsensitive, exampleQuerySql); int[] returningColumnTypes = dbmsDialect.needsReturningSqlTypes() ? getReturningColumnTypes(queryPlan, sfi) : null;
CacheEntry<HQLQueryPlan> queryPlanEntry = getQueryPlan(sfi, exampleQuery, cacheKey); HQLQueryPlan queryPlan = queryPlanEntry.getValue(); String exampleQuerySql = queryPlan.getSqlStrings()[0];