You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2009/05/12 06:12:28 UTC
svn commit: r773776 - in /openjpa/trunk:
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java
Author: fancy
Date: Tue May 12 04:12:27 2009
New Revision: 773776
URL: http://svn.apache.org/viewvc?rev=773776&view=rev
Log:
OPENJPA-1064 JPA2 Query add support for embeddable of element collection in predicate and subquery
- Add test strings for any, some, member of predicates
- Fix a bug in parameter processing of embeddable object
Modified:
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java?rev=773776&r1=773775&r2=773776&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java Tue May 12 04:12:27 2009
@@ -146,4 +146,11 @@
else
sql.appendValue(pstate.sqlValue, pstate.getColumn(index), this);
}
+
+ public int length(Select sel, ExpContext ctx, ExpState state) {
+ ParamExpState pstate = (ParamExpState) state;
+ if (getMetaData() == null || pstate.cols == null)
+ return 1;
+ return pstate.cols.length;
+ }
}
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java?rev=773776&r1=773775&r2=773776&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java Tue May 12 04:12:27 2009
@@ -1595,13 +1595,115 @@
" order by e.intVal3",
*/
};
+ String[] query2 = {
+ "select e, e.intVal1, e.embed.intVal2 from " +
+ " EntityA_Coll_Embed_Embed a " +
+ " , in (a.embeds) e WHERE e.intVal1 < ANY (select e2.intVal2 " +
+ " from EntityA_Coll_Embed_Embed a1, in (a1.embeds) e2) " +
+ " order by e.intVal3",
+ "select e, e.intVal1, e.embed.intVal2 from " +
+ " EntityA_Coll_Embed_Embed a " +
+ " , in (a.embeds) e WHERE e.intVal1 < ALL (select e2.intVal2 " +
+ " from EntityA_Coll_Embed_Embed a1, in (a1.embeds) e2) " +
+ " order by e.intVal3",
+ "select e, e.intVal1, e.embed.intVal2 from " +
+ " EntityA_Coll_Embed_Embed a " +
+ " , in (a.embeds) e WHERE e.intVal1 <= SOME (select e2.intVal2 " +
+ " from EntityA_Coll_Embed_Embed a1, in (a1.embeds) e2) " +
+ " order by e.intVal3",
+ "select e, e.intVal1, e.embed.intVal2 from " +
+ " EntityA_Coll_Embed_Embed a " +
+ " , in (a.embeds) e WHERE e.intVal1 > ALL (select e2.intVal2 " +
+ " from EntityA_Coll_Embed_Embed a1, in (a1.embeds) e2) " +
+ " order by e.intVal3",
+ // non-corelated subquery:
+ // TODO: known problem in table alias resolution for subquery
+ // the genarated SQL subquery should be non-corelated,
+ // but generated corelated subquery.
+ "select e, e.intVal1, e.embed.intVal2 from " +
+ " EntityA_Coll_Embed_Embed a " +
+ " , in (a.embeds) e WHERE e.intVal1 < ANY (select e.intVal2 " +
+ " from EntityA_Coll_Embed_Embed a, in (a.embeds) e) " +
+ " order by e.intVal3",
+ "select e, e.intVal1, e.embed.intVal2 from " +
+ " EntityA_Coll_Embed_Embed a " +
+ " , in (a.embeds) e WHERE e.intVal1 < ALL (select e.intVal2 " +
+ " from EntityA_Coll_Embed_Embed a, in (a.embeds) e) " +
+ " order by e.intVal3",
+ "select e, e.intVal1, e.embed.intVal2 from " +
+ " EntityA_Coll_Embed_Embed a " +
+ " , in (a.embeds) e WHERE e.intVal1 <= SOME (select e.intVal2 " +
+ " from EntityA_Coll_Embed_Embed a, in (a.embeds) e) " +
+ " order by e.intVal3",
+ "select e, e.intVal1, e.embed.intVal2 from " +
+ " EntityA_Coll_Embed_Embed a " +
+ " , in (a.embeds) e WHERE e.intVal1 > ALL (select e.intVal2 " +
+ " from EntityA_Coll_Embed_Embed a, in (a.embeds) e) " +
+ " order by e.intVal3",
+ // corelated subquery:
+ // TODO: known problem in table alias resolution for subquery
+ // the genarated SQL subquery should be corelated,
+ // but generated non-corelated subquery.
+ "select e, e.intVal1, e.embed.intVal2 from " +
+ " EntityA_Coll_Embed_Embed a " +
+ " , in (a.embeds) e WHERE e.intVal1 < ANY (select e2.intVal2 " +
+ " from in(a.embeds) e2) " +
+ " order by e.intVal3",
+ "select e, e.intVal1, e.embed.intVal2 from " +
+ " EntityA_Coll_Embed_Embed a " +
+ " , in (a.embeds) e WHERE e.intVal1 < ALL (select e2.intVal2 " +
+ " from a.embeds e2) " +
+ " order by e.intVal3",
+ "select e, e.intVal1, e.embed.intVal2 from " +
+ " EntityA_Coll_Embed_Embed a " +
+ " , in (a.embeds) e WHERE e.intVal1 <= SOME (select e2.intVal2 " +
+ " from in(a.embeds) e2) " +
+ " order by e.intVal3",
+ "select e, e.intVal1, e.embed.intVal2 from " +
+ " EntityA_Coll_Embed_Embed a " +
+ " , in (a.embeds) e WHERE e.intVal1 > ALL (select e2.intVal2 " +
+ " from a.embeds e2) " +
+ " order by e.intVal3",
+ };
+ String[] query3 = {
+ // query with parameter of embeddable object
+ "select e, e.intVal1, e.embed.intVal2 from " +
+ " EntityA_Coll_Embed_Embed a " +
+ " , in (a.embeds) e WHERE ?1 MEMBER OF a.embeds " +
+ " order by e.intVal3",
+ "select e, e.intVal1, e.embed.intVal2 from " +
+ " EntityA_Coll_Embed_Embed a " +
+ " left join a.embeds e WHERE ?1 MEMBER OF a.embeds " +
+ " order by e.intVal3",
+ "select e, e.intVal1, e.embed.intVal2 from " +
+ " EntityA_Coll_Embed_Embed a " +
+ " , in (a.embeds) e WHERE ?1 = e " +
+ " order by e.intVal3",
+ };
+
List rs = null;
+ Object obj = null;
for (int i = 0; i < query.length; i++) {
rs = em.createQuery(query[i]).getResultList();
assertTrue(rs.size() > 0);
- Object obj = ((Object[]) rs.get(0))[0];
+ obj = ((Object[]) rs.get(0))[0];
assertTrue(obj instanceof Embed_Embed);
}
+ for (int i = 0; i < query2.length; i++) {
+ rs = em.createQuery(query2[i]).getResultList();
+ if (rs.size() > 0) {
+ obj = ((Object[]) rs.get(0))[0];
+ assertTrue(obj instanceof Embed_Embed);
+ }
+ }
+ for (int i = 0; i < query3.length; i++) {
+ rs = em.createQuery(query3[i]).setParameter(1, obj).getResultList();
+ if (rs.size() > 0) {
+ obj = ((Object[]) rs.get(0))[0];
+ assertTrue(obj instanceof Embed_Embed);
+ }
+ }
+
em.clear();
EntityTransaction tran = em.getTransaction();