diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java index 729e745e858..216dc75293b 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java @@ -1397,7 +1397,7 @@ public void test330InOidTest() throws Exception { "from\n" + " RObject o\n" + "where\n" + - " o.oid in :oid\n"; + " o.oid in (:oid)\n"; assertEqualsIgnoreWhitespace(expected, real); } finally { close(session); @@ -1417,7 +1417,7 @@ public void test335OwnerInOidTest() throws Exception { "from\n" + " RAccessCertificationCase a\n" + "where\n" + - " a.ownerOid in :ownerOid"; + " a.ownerOid in (:ownerOid)"; assertEqualsIgnoreWhitespace(expected, real); } finally { close(session); @@ -2021,7 +2021,7 @@ public void test550queryObjectClassTypeAbstractRole() throws Exception { "from\n" + " RObject o\n" + "where\n" + - " o.objectTypeClass in :objectTypeClass"; + " o.objectTypeClass in (:objectTypeClass)"; assertEqualsIgnoreWhitespace(expected, real); } finally { @@ -2292,6 +2292,36 @@ public void test600QueryObjectypeByTypeComplex() throws Exception { } } + @Test + public void test601QueryObjectypeByTwoAbstractTypes() throws Exception { + Session session = open(); + try { + ObjectQuery query = QueryBuilder.queryFor(ObjectType.class, prismContext) + .type(FocusType.class).block().endBlock() + .or().type(AbstractRoleType.class).block().endBlock() + .build(); + String real = getInterpretedQuery2(session, ObjectType.class, query); + String expected = "select\n" + + " o.fullObject,\n" + + " o.stringsCount,\n" + + " o.longsCount,\n" + + " o.datesCount,\n" + + " o.referencesCount,\n" + + " o.polysCount,\n" + + " o.booleansCount\n" + + "from\n" + + " RObject o\n" + + "where\n" + + " (\n" + + " o.objectTypeClass in (:objectTypeClass) or\n" + + " o.objectTypeClass in (:objectTypeClass2)\n" + + " )\n"; + assertEqualsIgnoreWhitespace(expected, real); + } finally { + close(session); + } + } + @Test public void test605QueryObjectypeByTypeAndReference() throws Exception { Session session = open(); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/hqm/condition/InCondition.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/hqm/condition/InCondition.java index 58495499d22..36ae9824760 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/hqm/condition/InCondition.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/hqm/condition/InCondition.java @@ -48,7 +48,12 @@ public void dumpToHql(StringBuilder sb, int indent) { if (values != null) { String parameterNamePrefix = createParameterName(propertyPath); String parameterName = rootHibernateQuery.addParameter(parameterNamePrefix, values); // TODO special treatment of collections? - sb.append(propertyPath).append(" in :").append(parameterName); + // these parentheses are here because of hibernate bug, manifesting itself as MID-3390 + boolean useParentheses = values.size() != 1; // just a (quite dubious) optimization + sb.append(propertyPath).append(" in ") + .append(useParentheses ? "(" : "") + .append(":").append(parameterName) + .append(useParentheses ? ")" : ""); } else { sb.append(propertyPath).append(" in (").append(innerQueryText).append(")"); }