You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2009/06/30 15:40:18 UTC
svn commit: r789723 [1/2] - in /openjpa/trunk:
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/
openjpa-persistence/src/main/java/org/apache/open...
Author: ppoddar
Date: Tue Jun 30 13:40:17 2009
New Revision: 789723
URL: http://svn.apache.org/viewvc?rev=789723&view=rev
Log:
OPENJPA-1143: Added support for construct(), as(). Metamodel excludes static fields. tests edited to compile against EA3 JPA API.
Added:
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/NewInstanceSelection.java (with props)
Modified:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Magazine_.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Publisher_.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJoinCondition.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestSubqueries.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ImplicitFieldAccessMappedSuperclass_.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetamodel.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ResultItemImpl.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FetchPathImpl.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ParameterImpl.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AbstractManagedType.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/SourceAnnotationHandler.java
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java Tue Jun 30 13:40:17 2009
@@ -18,8 +18,11 @@
*/
package org.apache.openjpa.persistence.criteria;
+import java.io.PrintWriter;
+import java.io.StringWriter;
import java.lang.reflect.Method;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -53,46 +56,48 @@
*/
public abstract class CriteriaTest extends TestCase {
protected static OpenJPAEntityManagerFactorySPI emf;
+ protected static SQLAuditor auditor;
+
QueryBuilder cb;
EntityManager em;
- protected List<String> sql = new ArrayList<String>();
+
protected static Class[] CLASSES = {
- Account.class,
- Address.class,
- A.class,
- B.class,
- CompUser.class,
- Contact.class,
- Contractor.class,
- Course.class,
- CreditCard.class,
- Customer.class,
- C.class,
- Department.class,
- DependentId.class,
- Dependent.class,
- D.class,
- Employee.class,
- Exempt.class,
- FemaleUser.class,
- FrequentFlierPlan.class,
- Item.class,
- LineItem.class,
- Magazine.class,
- MaleUser.class,
- Manager.class,
- Movie.class,
- Order.class,
- Person.class,
- Phone.class,
- Photo.class,
- Product.class,
- Publisher.class,
- Semester.class,
- Student.class,
- TransactionHistory.class,
- Transaction.class,
- VideoStore.class};
+ Account.class,
+ Address.class,
+ A.class,
+ B.class,
+ CompUser.class,
+ Contact.class,
+ Contractor.class,
+ Course.class,
+ CreditCard.class,
+ Customer.class,
+ C.class,
+ Department.class,
+ DependentId.class,
+ Dependent.class,
+ D.class,
+ Employee.class,
+ Exempt.class,
+ FemaleUser.class,
+ FrequentFlierPlan.class,
+ Item.class,
+ LineItem.class,
+ Magazine.class,
+ MaleUser.class,
+ Manager.class,
+ Movie.class,
+ Order.class,
+ Person.class,
+ Phone.class,
+ Photo.class,
+ Product.class,
+ Publisher.class,
+ Semester.class,
+ Student.class,
+ TransactionHistory.class,
+ Transaction.class,
+ VideoStore.class};
protected Class[] getDomainClasses() {
return CLASSES;
@@ -100,6 +105,7 @@
public void setUp() {
if (emf == null) {
+ auditor = new SQLAuditor();
createNamedEMF(getDomainClasses());
assertNotNull(emf);
setDictionary();
@@ -107,6 +113,7 @@
em = emf.createEntityManager();
cb = emf.getQueryBuilder();
}
+
/**
* Create an entity manager factory for persistence unit <code>pu</code>.
* Put {@link #CLEAR_TABLES} in
@@ -120,13 +127,12 @@
Map<Object,Object> map = new HashMap<Object,Object>();
map.put("openjpa.jdbc.SynchronizeMappings",
"buildSchema(ForeignKeys=true,"
- + "SchemaAction='add,deleteTableContents')");
+ + "SchemaAction='add')");
map.put("openjpa.jdbc.QuerySQLCache", "false");
map.put("openjpa.DynamicEnhancementAgent", "false");
map.put("openjpa.RuntimeUnenhancedClasses", "unsupported");
map.put("openjpa.Compatibility", "QuotedNumbersInQueries=true");
- map.put("openjpa.jdbc.JDBCListeners",
- new JDBCListener[] { new Listener() });
+ map.put("openjpa.jdbc.JDBCListeners", new JDBCListener[] { auditor });
StringBuffer buf = new StringBuffer();
for (Class<?> c : types) {
@@ -135,17 +141,11 @@
buf.append(c.getName());
}
- map.put("openjpa.MetaDataFactory",
- "jpa(Types=" + buf.toString() + ")");
+ map.put("openjpa.MetaDataFactory", "jpa(Types=" + buf.toString() + ")");
- Map config = new HashMap(System.getProperties());
+ Map<Object,Object> config = new HashMap<Object,Object>(System.getProperties());
config.putAll(map);
- emf = (OpenJPAEntityManagerFactorySPI)
- Persistence.createEntityManagerFactory("test", config);
- }
-
- public final void tearDown() {
- // important: do nothing
+ emf = (OpenJPAEntityManagerFactorySPI) Persistence.createEntityManagerFactory("test", config);
}
void setDictionary() {
@@ -156,57 +156,36 @@
}
/**
- * Executes the given CriteriaQuery and JPQL string and compare their
- * respective SQLs for equality.
+ * Executes the given CriteriaQuery and JPQL string and compare their respective SQLs for equality.
*/
- void assertEquivalence(CriteriaQuery c, String jpql, String[] paramNames,
- Object[] params) {
+ void assertEquivalence(CriteriaQuery<?> c, String jpql) {
+ assertEquivalence(c, jpql, null);
+ }
+
+ /**
+ * Executes the given CriteriaQuery and JPQL string and compare their respective SQLs for equality.
+ * Sets the supplied parameters, if any.
+ */
+ void assertEquivalence(CriteriaQuery<?> c, String jpql, String[] paramNames, Object[] params) {
Query cQ = em.createQuery(c);
- for (int i = 0; i < paramNames.length; i++) {
- cQ.setParameter(paramNames[i], params[i]);
- }
Query jQ = em.createQuery(jpql);
- for (int i = 0; i < paramNames.length; i++) {
- jQ.setParameter(paramNames[i], params[i]);
- }
- executeAndAssert(cQ, jQ);
+ setParameters(cQ, paramNames, params);
+ setParameters(jQ, paramNames, params);
+
+ executeAndCompareSQL(jpql, cQ, jQ);
}
/**
- * Executes the given CriteriaQuery and JPQL string and compare their
- * respective SQLs for equality.
+ * Executes the given CriteriaQuery and JPQL string and compare their respective SQLs for equality.
*/
- void assertEquivalence(CriteriaQuery c, String jpql, Object[] params) {
+ void assertEquivalence(CriteriaQuery<?> c, String jpql, Object[] params) {
Query cQ = em.createQuery(c);
- for (int i = 0; i < params.length; i++) {
- cQ.setParameter(i + 1, params[i]);
- }
-
Query jQ = em.createQuery(jpql);
- for (int i = 0; i < params.length; i++) {
- jQ.setParameter(i + 1, params[i]);
- }
+ setParameters(cQ, params);
+ setParameters(jQ, params);
- executeAndAssert(cQ, jQ);
- }
-
- void assertEquivalence(CriteriaQuery c, String jpql) {
- executeAndAssert(em.createQuery(c), em.createQuery(jpql));
- }
-
- void executeAndAssert(Query cQ, Query jQ) {
- List<String>[] sqls = new ArrayList[2];
- String jpql = OpenJPAPersistence.cast(jQ).getQueryString();
- if (!execute(jpql, cQ, jQ, sqls)) {
- fail(sqlReport("Invalid SQL for Criteria",jpql, sqls[0], sqls[1]));
- }
- assertEquals(sqlReport("Unequal number of SQL ",jpql, sqls[0], sqls[1])
- , sqls[0].size(), sqls[1].size());
- for (int i = 0; i < sqls[0].size(); i++)
- //sqlReport("Wrong SQL at " + i,jpql, sqls[0], sqls[1]),
- assertEquals(
- sqls[0].get(i), sqls[1].get(i));
+ executeAndCompareSQL(jpql, cQ, jQ);
}
/**
@@ -218,71 +197,82 @@
* array.
* @return true if both queries execute successfully.
*/
- boolean execute(String jpql, Query cQ, Query jQ, List<String>[] sqls) {
- sql.clear();
+ void executeAndCompareSQL(String jpql, Query cQ, Query jQ) {
+ List<String> jSQL = null;
+ List<String> cSQL = null;
try {
- List jList = jQ.getResultList();
- } catch (PersistenceException e) {
- e.printStackTrace();
- sqls[0] = new ArrayList<String>();
- sqls[0].add(extractSQL(e));
- fail("Wrong SQL for JPQL :" + jpql + "\r\nSQL :" + sqls[0]);
+ jSQL = executeQueryAndCollectSQL(jQ);
} catch (Exception e) {
- e.printStackTrace();
- fail("Wrong JPQL :" + jpql);
+ StringWriter w = new StringWriter();
+ e.printStackTrace(new PrintWriter(w));
+ fail("JPQL " + jpql + " failed to execute\r\n" + w);
}
- sqls[0] = new ArrayList<String>(sql);
-
- sql.clear();
try {
- List cList = cQ.getResultList();
- } catch (PersistenceException e) {
- e.printStackTrace();
- sqls[1] = new ArrayList<String>();
- sqls[1].add(extractSQL(e));
- return false;
- }
- sqls[1] = new ArrayList<String>(sql);
-
- return true;
- }
-
- List<String> executeJPQL(String jpql, Map<?,Object> params) {
- sql.clear();
- Query q = em.createQuery(jpql);
- if (params != null) {
- for (Object key : params.keySet()) {
- if (key instanceof String)
- q.setParameter(key.toString(), params.get(key));
- else if (key instanceof String)
- q.setParameter(key.toString(), params.get(key));
- else
- throw new RuntimeException("Bad Parameter key " + key);
- }
+ cSQL = executeQueryAndCollectSQL(cQ);
+ } catch (Exception e) {
+ StringWriter w = new StringWriter();
+ e.printStackTrace(new PrintWriter(w));
+ fail("CriteriaQuery corresponding to " + jpql + " failed to execute\r\n" + w);
}
- return sql;
+ printSQL("Target SQL for JPQL", jSQL);
+ printSQL("Target SQL for CriteriaQuery", cSQL);
+ if (jSQL.size() != cSQL.size()) {
+ printSQL("Target SQL for JPQL", jSQL);
+ printSQL("Target SQL for CriteriaQuery", cSQL);
+ assertEquals("No. of SQL generated for JPQL and CriteriaQuery for " + jpql + " is different",
+ jSQL.size(), cSQL.size());
+ }
+
+ for (int i = 0; i < jSQL.size(); i++) {
+ if (!jSQL.get(i).equals(cSQL.get(i))) {
+ printSQL("Target SQL for JPQL", jSQL);
+ printSQL("Target SQL for CriteriaQuery", cSQL);
+ assertEquals(i + "-th SQL for JPQL and CriteriaQuery for " + jpql + " is different",
+ jSQL.get(i), cSQL.get(i));
+ }
+ }
+ }
+
+ void printSQL(String header, List<String> sqls) {
+ System.err.println(header);
+ for (int i = 0; sqls != null && i < sqls.size(); i++) {
+ System.err.println(i + ":" + sqls.get(i));
+ }
+ }
+
+ void setParameters(Query q, String[] paramNames, Object[] params) {
+ for (int i = 0; paramNames != null && i < paramNames.length; i++)
+ q.setParameter(paramNames[i], params[i]);
+ }
+
+ void setParameters(Query q, Object[] params) {
+ for (int i = 0; params != null && i < params.length; i++)
+ q.setParameter(i+1, params[i]);
+ }
+
+ /**
+ * Execute the given query and return the generated SQL.
+ * If the query execution fail because the generated SQL is ill-formed, then raised exception should
+ * carry the ill-formed SQL for diagnosis.
+ */
+ List<String> executeQueryAndCollectSQL(Query q) {
+ auditor.clear();
+ try {
+ List<?> result = q.getResultList();
+ } catch (Exception e) {
+ throw new RuntimeException(extractSQL(e), e);
+ }
+ assertFalse(auditor.getSQLs().isEmpty());
+ return auditor.getSQLs();
}
- String extractSQL(PersistenceException e) {
+ String extractSQL(Exception e) {
Throwable t = e.getCause();
if (t instanceof ReportingSQLException)
return ((ReportingSQLException) t).getSQL();
- return null;
- }
-
- private String sqlReport(String header, String jpql, List<String> jSQLs,
- List<String> cSQLs) {
- StringBuffer tmp = new StringBuffer(header).append("\r\n")
- .append("JPQL:["+jpql+"]").append("\r\n");
- tmp.append(jSQLs.size() + " target SQL for JPQL").append("\r\n");
- for (String s : jSQLs)
- tmp.append(s).append("\r\n");
- tmp.append(cSQLs.size() + " target SQL for Critera").append("\r\n");
- for (String s : cSQLs)
- tmp.append(s).append("\r\n");
- return tmp.toString();
+ return "Can not extract SQL from exception " + e;
}
@Override
@@ -327,14 +317,23 @@
}
- public class Listener
- extends AbstractJDBCListener {
-
- @Override
- public void beforeExecuteStatement(JDBCEvent event) {
- if (event.getSQL() != null && sql != null) {
- sql.add(event.getSQL());
+ public class SQLAuditor extends AbstractJDBCListener {
+ private List<String> sqls = new ArrayList<String>();
+
+ @Override
+ public void beforeExecuteStatement(JDBCEvent event) {
+ if (event.getSQL() != null && sqls != null) {
+ System.err.println("Adding " + event.getSQL());
+ sqls.add(event.getSQL());
+ }
+ }
+
+ void clear() {
+ sqls.clear();
+ }
+
+ List<String> getSQLs() {
+ return new ArrayList<String>(sqls);
}
}
}
-}
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Magazine_.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Magazine_.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Magazine_.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Magazine_.java Tue Jun 30 13:40:17 2009
@@ -14,5 +14,4 @@
public static volatile SingularAttribute<Magazine,Integer> id;
public static volatile SingularAttribute<Magazine,Publisher> idPublisher;
public static volatile SingularAttribute<Magazine,String> name;
- public static volatile SingularAttribute<Magazine,Long> serialVersionUID;
}
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Publisher_.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Publisher_.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Publisher_.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Publisher_.java Tue Jun 30 13:40:17 2009
@@ -13,5 +13,4 @@
public static volatile SingularAttribute<Publisher,Integer> id;
public static volatile SetAttribute<Publisher,Magazine> magazineCollection;
public static volatile SingularAttribute<Publisher,String> name;
- public static volatile SingularAttribute<Publisher,Long> serialVersionUID;
}
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJoinCondition.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJoinCondition.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJoinCondition.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestJoinCondition.java Tue Jun 30 13:40:17 2009
@@ -37,21 +37,21 @@
CriteriaQuery<?> cq = cb.createQuery();
Root<C> c = cq.from(C.class);
CollectionJoin<C,D> d = c.join(C_.coll);
- assertSame(Collection.class, d.getJavaType());
+ assertSame(D.class, d.getJavaType());
}
public void testSetJoinModel() {
CriteriaQuery<?> cq = cb.createQuery();
Root<C> c = cq.from(C.class);
SetJoin<C,D> d = c.join(C_.set);
- assertSame(Set.class, d.getJavaType());
+ assertSame(D.class, d.getJavaType());
}
public void testListJoinModel() {
CriteriaQuery<?> cq = cb.createQuery();
Root<C> c = cq.from(C.class);
ListJoin<C,D> d = c.join(C_.list);
- assertSame(List.class, d.getJavaType());
+ assertSame(D.class, d.getJavaType());
}
public void testInnerJoinSingleAttributeWithoutCondition() {
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java Tue Jun 30 13:40:17 2009
@@ -22,11 +22,14 @@
import java.util.List;
import javax.persistence.Parameter;
+import javax.persistence.Tuple;
import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.ListJoin;
import javax.persistence.criteria.MapJoin;
+import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.SetJoin;
import javax.persistence.criteria.Subquery;
@@ -139,7 +142,6 @@
assertEquivalence(q, jpql);
}
- @AllowFailure(message="FetchJoin not implemented")
public void testFetchJoins() {
String jpql = "SELECT d FROM Department d LEFT JOIN FETCH d.employees "
+ "WHERE d.deptNo = 1";
@@ -158,30 +160,28 @@
+ "JOIN e.contactInfo.phones p "
+ "WHERE e.contactInfo.address.zipCode = '95054'";
- CriteriaQuery q = cb.createQuery();
- Root<Employee> emp = q.from(Employee.class);
- Join<Contact, Phone> phone = emp.join(
- employee_.getSingularAttribute("contactInfo", Contact.class)).join(
- contact_.getList("phones", Phone.class));
- q.where(cb.equal(emp.get(
- employee_.getSingularAttribute("contactInfo", Contact.class)).get(
- contact_.getSingularAttribute("address", Address.class)).get(
- address_.getSingularAttribute("zipCode", String.class)), "95054"));
- q.select(phone.get(phone_.getSingularAttribute("vendor", String.class)));
+
+ CriteriaQuery<String> q = cb.createQuery(String.class);
+ Root<Employee> e = q.from(Employee.class);
+ Join<Contact, Phone> p = e.join(employee_.getSingularAttribute("contactInfo", Contact.class))
+ .join(contact_.getList("phones", Phone.class));
+ q.where(cb.equal(e.get(employee_.getSingularAttribute("contactInfo", Contact.class))
+ .get(contact_.getSingularAttribute("address", Address.class))
+ .get(address_.getSingularAttribute("zipCode", String.class)),
+ "95054"));
+ q.select(p.get(phone_.getSingularAttribute("vendor", String.class)));
assertEquivalence(q, jpql);
}
public void testKeyPathNavigation() {
- String jpql = "SELECT i.name, p FROM Item i JOIN i.photos p "
- + "WHERE KEY(p) LIKE '%egret%'";
+ String jpql = "SELECT i.name, p FROM Item i JOIN i.photos p WHERE KEY(p) LIKE '%egret%'";
- CriteriaQuery q = cb.createQuery();
- Root<Item> item = q.from(Item.class);
- MapJoin<Item, String, Photo> photo = item.join(
- item_.getMap("photos", String.class, Photo.class));
- q.multiselect(item.get(item_.getSingularAttribute("name", String.class)), photo)
- .where(cb.like(photo.key(), "%egret%"));
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
+ Root<Item> i = q.from(Item.class);
+ MapJoin<Item, String, Photo> p = i.join(item_.getMap("photos", String.class, Photo.class));
+ q.multiselect(i.get(item_.getSingularAttribute("name", String.class)), p)
+ .where(cb.like(p.key(), "%egret%"));
assertEquivalence(q, jpql);
}
@@ -191,23 +191,22 @@
+ "WHERE c.customer.accountNum = 321987 AND INDEX(t) BETWEEN 0 "
+ "AND 9";
- CriteriaQuery cq = cb.createQuery();
+ CriteriaQuery<TransactionHistory> cq = cb.createQuery(TransactionHistory.class);
Root<CreditCard> c = cq.from(CreditCard.class);
- ListJoin<CreditCard, TransactionHistory> t = c.join(creditCard_
- .getList("transactionHistory", TransactionHistory.class));
- cq.select(t).where(
- cb.equal(c.get(
- creditCard_.getSingularAttribute("customer", Customer.class))
- .get(customer_.getSingularAttribute("accountNum", Long.class)),
- 321987), cb.between(t.index(), 0, 9));
+ ListJoin<CreditCard, TransactionHistory> t = c.join(creditCard_.getList("transactionHistory",
+ TransactionHistory.class));
+ Predicate p1 = cb.equal(
+ c.get(creditCard_.getSingularAttribute("customer", Customer.class))
+ .get(customer_.getSingularAttribute("accountNum", long.class)), 321987);
+ Predicate p2 = cb.between(t.index(), 0, 9);
+ cq.select(t).where(p1,p2);
assertEquivalence(cq, jpql);
}
- @AllowFailure(message="as() not implemented")
public void testIsEmptyExpressionOnJoin() {
String jpql = "SELECT o FROM Order o WHERE o.lineItems IS EMPTY";
- CriteriaQuery q = cb.createQuery();
+ CriteriaQuery<Order> q = cb.createQuery(Order.class);
Root<Order> o = q.from(Order.class);
ListJoin<Order,LineItem> lineItems =
o.join(order_.getList("lineItems", LineItem.class));
@@ -221,19 +220,17 @@
+ "a.zipCode FROM Customer c JOIN c.orders o JOIN c.address a "
+ "WHERE a.state = 'CA' AND a.county = 'Santa Clara'";
- CriteriaQuery q = cb.createQuery();
- Root<Customer> cust = q.from(Customer.class);
- Join<Customer, Order> order = cust.join(customer_.getSet("orders",
- Order.class));
- Join<Customer, Address> address = cust.join(customer_.getSingularAttribute(
- "address", Address.class));
- q.where(cb.equal(address.get(address_.getSingularAttribute("state",
- String.class)), "CA"), cb.equal(address.get(address_
- .getSingularAttribute("county", String.class)), "Santa Clara"));
- q.multiselect(order.get(order_.getSingularAttribute("quantity", Integer.class)),
- cb.prod(order.get(order_
- .getSingularAttribute("totalCost", Double.class)), 1.08),
- address.get(address_.getSingularAttribute("zipCode", String.class)));
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
+ Root<Customer> c = q.from(Customer.class);
+ Join<Customer, Order> o = c.join(customer_.getSet("orders", Order.class));
+ Join<Customer, Address> a = c.join(customer_.getSingularAttribute("address", Address.class));
+ Expression<Double> taxedCost = cb.prod(o.get(order_.getSingularAttribute("totalCost", Double.class)), 1.08);
+ taxedCost.setAlias("taxedCost");
+ q.where(cb.equal(a.get(address_.getSingularAttribute("state", String.class)), "CA"),
+ cb.equal(a.get(address_.getSingularAttribute("county", String.class)), "Santa Clara"));
+ q.multiselect(o.get(order_.getSingularAttribute("quantity", Integer.class)),
+ taxedCost,
+ a.get(address_.getSingularAttribute("zipCode", String.class)));
assertEquivalence(q, jpql);
}
@@ -251,15 +248,12 @@
String jpql = "SELECT w.name FROM Course c JOIN c.studentWaitList w "
+ "WHERE c.name = 'Calculus' AND INDEX(w) = 0";
- CriteriaQuery q = cb.createQuery();
+ CriteriaQuery<String> q = cb.createQuery(String.class);
Root<Course> course = q.from(Course.class);
- ListJoin<Course, Student> w = course.join(course_.getList(
- "studentWaitList", Student.class));
- q.where(
- cb.equal(
- course.get(course_.getSingularAttribute("name", String.class)),
- "Calculus"), cb.equal(w.index(), 0)).select(
- w.get(student_.getSingularAttribute("name", String.class)));
+ ListJoin<Course, Student> w = course.join(course_.getList("studentWaitList", Student.class));
+ q.where(cb.equal(course.get(course_.getSingularAttribute("name", String.class)), "Calculus"),
+ cb.equal(w.index(), 0))
+ .select(w.get(student_.getSingularAttribute("name", String.class)));
assertEquivalence(q, jpql);
}
@@ -274,10 +268,8 @@
LineItem.class));
Join<Order, Customer> c = o.join(order_.getSingularAttribute("customer",
Customer.class));
- q.where(cb
- .equal(c.get(customer_.getSingularAttribute("lastName", String.class)),
- "Smith"), cb.equal(c.get(customer_.getSingularAttribute(
- "firstName", String.class)), "John"));
+ q.where(cb.equal(c.get(customer_.getSingularAttribute("lastName", String.class)), "Smith"),
+ cb.equal(c.get(customer_.getSingularAttribute("firstName", String.class)), "John"));
q.select(cb.sum(i.get(lineItem_.getSingularAttribute("price", Double.class))));
assertEquivalence(q, jpql);
@@ -312,18 +304,13 @@
employee_.getSingularAttribute("department", Department.class))
.get(department_.getSingularAttribute("name", String.class)),
"Engineering"));
- q.multiselect(e.get(employee_.getSingularAttribute("name", String.class)), cb
- .selectCase().when(
- cb.equal(e.get(employee_.getSingularAttribute("rating",
- Integer.class)), 1),
- cb.prod(e.get(employee_.getSingularAttribute("salary",
- Long.class)), 1.1)).when(
- cb.equal(e.get(employee_.getSingularAttribute("rating",
- Integer.class)), 2),
- cb.prod(e.get(employee_.getSingularAttribute("salary",
- Long.class)), 1.2)).otherwise(
- cb.prod(e.get(employee_.getSingularAttribute("salary",
- Long.class)), 1.01)));
+ q.multiselect(e.get(employee_.getSingularAttribute("name", String.class)),
+ cb.selectCase().when(
+ cb.equal(e.get(employee_.getSingularAttribute("rating", Integer.class)), 1),
+ cb.prod(e.get(employee_.getSingularAttribute("salary", Long.class)), 1.1)).when(
+ cb.equal(e.get(employee_.getSingularAttribute("rating", Integer.class)), 2),
+ cb.prod(e.get(employee_.getSingularAttribute("salary", Long.class)), 1.2)).otherwise(
+ cb.prod(e.get(employee_.getSingularAttribute("salary", Long.class)), 1.01)));
assertEquivalence(q, jpql);
}
@@ -350,22 +337,21 @@
assertEquivalence(q, jpql, new String[] { "stat" }, new Object[] { 1 });
}
- @AllowFailure(message="Generates invalid SQL")
public void testKeyExpressionInSelectList() {
- String jpql = "SELECT v.location.street, KEY(i).title, VALUE(i) FROM "
- + "VideoStore v JOIN v.videoInventory i "
- + "WHERE v.location.zipCode = " + "'94301' AND VALUE(i) > 0";
+ String jpql = "SELECT v.location.street, KEY(i).title, VALUE(i) "
+ + "FROM VideoStore v JOIN v.videoInventory i "
+ + "WHERE v.location.zipCode = '94301' AND VALUE(i) > 0";
+
CriteriaQuery<?> q = cb.createQuery();
Root<VideoStore> v = q.from(VideoStore.class);
- MapJoin<VideoStore, Movie, Integer> inv = v.join(videoStore_.getMap(
- "videoInventory", Movie.class, Integer.class));
- q.where(cb.equal(v.get(
- videoStore_.getSingularAttribute("location", Address.class)).get(
- address_.getSingularAttribute("zipCode", String.class)), "94301"), cb
- .gt(inv.value(), 0));
+ MapJoin<VideoStore, Movie, Integer> i = v.join(videoStore_.getMap("videoInventory", Movie.class,Integer.class));
+ q.where(cb.equal(v.get(videoStore_.getSingularAttribute("location", Address.class))
+ .get(address_.getSingularAttribute("zipCode", String.class)), "94301"),
+ cb.gt(i.value(), 0));
q.multiselect(v.get(videoStore_.getSingularAttribute("location", Address.class))
- .get(address_.getSingularAttribute("street", String.class)), inv.key()
- .get(movie_.getSingularAttribute("title", String.class)), inv.value());
+ .get(address_.getSingularAttribute("street", String.class)),
+ i.key().get(movie_.getSingularAttribute("title", String.class)),
+ i.value());
assertEquivalence(q, jpql);
}
@@ -474,7 +460,6 @@
assertEquivalence(q, jpql);
}
- @AllowFailure(message="Root of the subquery._delegate not set")
public void testCorrelatedSubqueryWithAllClause() {
String jpql = "SELECT o FROM Order o JOIN o.customer c "
+ "WHERE 10000 < ALL (SELECT a.balance FROM c.accounts a)";
@@ -557,30 +542,25 @@
}
public void testOrderingWithNumericalExpressionInSelection() {
- String jpql = "SELECT o.quantity, o.totalCost * 1.08 AS taxedCost, "
- + "a.zipCode "
+ String jpql = "SELECT o.quantity, o.totalCost * 1.08 AS taxedCost, a.zipCode "
+ "FROM Customer c JOIN c.orders o JOIN c.address a "
+ "WHERE a.state = 'CA' AND a.county = 'Santa Clara' "
+ "ORDER BY o.quantity, taxedCost, a.zipCode";
CriteriaQuery<?> q = cb.createQuery();
Root<Customer> c = q.from(Customer.class);
- Join<Customer, Order> o = c.join(customer_.getSet("orders",
- Order.class));
- Join<Customer, Address> a = c.join(customer_.getSingularAttribute("address",
- Address.class));
- q.where(cb.equal(a.get(address_.getSingularAttribute("state", String.class)),
- "CA"), cb.equal(a.get(address_.getSingularAttribute("county",
- String.class)), "Santa Clara"));
- q.orderBy(
- cb.asc(o.get(order_.getSingularAttribute("quantity", Integer.class))),
- cb.asc(cb.prod(o.get(order_.getSingularAttribute("totalCost",
- Double.class)), 1.08)), cb.asc(a.get(address_
- .getSingularAttribute("zipCode", String.class))));
- q.multiselect(o.get(order_.getSingularAttribute("quantity", Integer.class)), cb
- .prod(o.get(order_.getSingularAttribute("totalCost", Double.class)),
- 1.08), a.get(address_.getSingularAttribute("zipCode",
- String.class)));
+ Join<Customer, Order> o = c.join(customer_.getSet("orders", Order.class));
+ Join<Customer, Address> a = c.join(customer_.getSingularAttribute("address", Address.class));
+ Expression<Double> taxedCost = cb.prod(o.get(order_.getSingularAttribute("totalCost", Double.class)), 1.08);
+ taxedCost.setAlias("taxedCost");
+ q.where(cb.equal(a.get(address_.getSingularAttribute("state", String.class)), "CA"),
+ cb.equal(a.get(address_.getSingularAttribute("county", String.class)), "Santa Clara"));
+ q.orderBy(cb.asc(o.get(order_.getSingularAttribute("quantity", Integer.class))),
+ cb.asc(taxedCost),
+ cb.asc(a.get(address_.getSingularAttribute("zipCode", String.class))));
+ q.multiselect(o.get(order_.getSingularAttribute("quantity", Integer.class)),
+ taxedCost,
+ a.get(address_.getSingularAttribute("zipCode", String.class)));
assertEquivalence(q, jpql);
}
}
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestSubqueries.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestSubqueries.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestSubqueries.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestSubqueries.java Tue Jun 30 13:40:17 2009
@@ -2,6 +2,7 @@
import java.sql.Timestamp;
+import javax.persistence.Tuple;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Join;
@@ -20,7 +21,7 @@
String query = "SELECT DISTINCT o.name FROM CompUser o WHERE EXISTS"
+ " (SELECT c FROM Address c WHERE c = o.address )";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<String> q = cb.createQuery(String.class);
Root<CompUser> o = q.from(CompUser.class);
Subquery<Address> sq = q.subquery(Address.class);
sq.correlate(o);
@@ -28,7 +29,7 @@
sq.select(c);
sq.where(cb.equal(c, o.get(CompUser_.address)));
q.where(cb.exists(sq));
-// q.select(o.get(CompUser_.name)).distinct(true);
+ q.select(o.get(CompUser_.name)).distinct(true);
assertEquivalence(q, query);
}
@@ -38,7 +39,7 @@
+ " (SELECT s FROM CompUser s WHERE s.address.country = "
+ "o.address.country)";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<String> q = cb.createQuery(String.class);
Root<CompUser> o = q.from(CompUser.class);
Subquery<CompUser> sq = q.subquery(CompUser.class);
sq.correlate(o);
@@ -47,7 +48,7 @@
sq.where(cb.equal(s.get(CompUser_.address).get(Address_.country), o
.get(CompUser_.address).get(Address_.country)));
q.where(cb.exists(sq).negate());
-// q.select(o.get(CompUser_.name)).distinct(true);
+ q.select(o.get(CompUser_.name)).distinct(true);
assertEquivalence(q, query);
}
@@ -58,9 +59,9 @@
+ " ANY (SELECT s.computerName "
+ " FROM CompUser s WHERE s.address.country IS NOT NULL)";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<String> q = cb.createQuery(String.class);
Root<CompUser> o = q.from(CompUser.class);
-// q.select(o.get(CompUser_.name));
+ q.select(o.get(CompUser_.name));
Subquery<String> sq = q.subquery(String.class);
Root<CompUser> s = sq.from(CompUser.class);
sq.select(s.get(CompUser_.computerName));
@@ -77,9 +78,9 @@
+ " (select distinct o.id from LineItem i, Order o"
+ " where i.quantity > 10 and o.count > 1000 and i.id = o.id)";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
Root<Order> o1 = q.from(Order.class);
-// q.select(o1.get(Order_.id));
+ q.select(o1.get(Order_.id));
Subquery<Integer> sq = q.subquery(Integer.class);
Root<LineItem> i = sq.from(LineItem.class);
@@ -98,9 +99,10 @@
String query = "select o.id from Order o where o.customer.balanceOwed ="
+ " (select max(o2.customer.balanceOwed) from Order o2"
+ " where o.customer.id = o2.customer.id)";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
Root<Order> o = q.from(Order.class);
-// q.select(o.get(Order_.id));
+ q.select(o.get(Order_.id));
Subquery<Integer> sq = q.subquery(Integer.class);
Root<Order> o2 = sq.from(Order.class);
sq.where(cb.equal(o.get(Order_.customer).get(Customer_.id), o2.get(
@@ -116,9 +118,10 @@
String query = "select o from Order o where o.customer.balanceOwed ="
+ " (select max(o2.customer.balanceOwed) from Order o2"
+ " where o.customer.id = o2.customer.id)";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Order> q = cb.createQuery(Order.class);
Root<Order> o = q.from(Order.class);
-// q.select(o);
+ q.select(o);
Subquery<Integer> sq = q.subquery(Integer.class);
Root<Order> o2 = sq.from(Order.class);
sq.where(cb.equal(o.get(Order_.customer).get(Customer_.id), o2.get(
@@ -133,9 +136,10 @@
public void testSubquery04() {
String query = "select o.id from Order o where o.quantity >"
+ " (select count(i) from o.lineItems i)";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
Root<Order> o = q.from(Order.class);
-// q.select(o.get(Order_.id));
+ q.select(o.get(Order_.id));
Subquery<Long> sq = q.subquery(Long.class);
Root<Order> osq = sq.correlate(o);
Join<Order, LineItem> i = osq.join(Order_.lineItems);
@@ -146,9 +150,10 @@
public void testSubquery05() {
String query = "select o.id from Order o where o.quantity >"
+ " (select count(o.quantity) from Order o)";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
Root<Order> o = q.from(Order.class);
-// q.select(o.get(Order_.id));
+ q.select(o.get(Order_.id));
Subquery<Long> sq = q.subquery(Long.class);
Root<Order> o2 = sq.from(Order.class);
q.where(cb.gt(o.get(Order_.quantity), sq.select(cb.count(o2
@@ -161,9 +166,10 @@
public void testSubquery06() {
String query = "select o.id from Order o where o.quantity >"
+ " (select count(o.id) from Order o)";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
Root<Order> o = q.from(Order.class);
-// q.select(o.get(Order_.id));
+ q.select(o.get(Order_.id));
Subquery<Long> sq = q.subquery(Long.class);
Root<Order> o2 = sq.from(Order.class);
q.where(cb.gt(o.get(Order_.quantity), sq.select(cb.count(o2
@@ -176,9 +182,10 @@
public void testSubquery07() {
String query = "select o.id from Order o where o.quantity >"
+ " (select avg(o.quantity) from Order o)";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
Root<Order> o = q.from(Order.class);
-// q.select(o.get(Order_.id));
+ q.select(o.get(Order_.id));
Subquery<Double> sq = q.subquery(Double.class);
Root<Order> o2 = sq.from(Order.class);
q.where(cb.gt(o.get(Order_.quantity), sq.select(cb.avg(o2
@@ -190,12 +197,12 @@
@AllowFailure(message="JPQL generates invalid SQL")
public void testSubquery08() {
String query = "select c.name from Customer c "
- + "where exists (select o from c.orders o where o.id = 1) "
- + "or exists (select o from c.orders o where o.id = 2)";
+ + "where exists(select o from c.orders o where o.id = 1) "
+ + "or exists(select o from c.orders o where o.id = 2)";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<String> q = cb.createQuery(String.class);
Root<Customer> c = q.from(Customer.class);
-// q.select(c.get(Customer_.name));
+ q.select(c.get(Customer_.name));
Subquery<Order> sq1 = q.subquery(Order.class);
Root<Customer> c1 = sq1.correlate(c);
SetJoin<Customer, Order> o1 = c1.join(Customer_.orders);
@@ -217,9 +224,10 @@
+ "where o.quantity between "
+ "(select max(o.quantity) from Order o) and "
+ "(select avg(o.quantity) from Order o) ";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<String> q = cb.createQuery(String.class);
Root<Customer> c = q.from(Customer.class);
-// q.select(c.get(Customer_.name));
+ q.select(c.get(Customer_.name));
Subquery<Integer> sq1 = q.subquery(Integer.class);
Root<Order> o1 = sq1.from(Order.class);
@@ -230,9 +238,7 @@
sq2.select(cb.avg(o2.get(Order_.quantity)));
SetJoin<Customer, Order> o = c.join(Customer_.orders);
- // not sure how to do call between of integer(quantity)
- // between integer (max quantity) and double (avg quantity)
- // q.where(cb.between(o.get(Order_.quantity), sq1, sq2));
+ q.where(cb.between(o.get(Order_.quantity), sq1, sq2.as(Integer.class)));
assertEquivalence(q, query);
}
@@ -243,9 +249,10 @@
+ " (select sum(o2.quantity) from Customer c, "
+ "in(c.orders) o2) ";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
Root<Order> o = q.from(Order.class);
-// q.select(o.get(Order_.id));
+ q.select(o.get(Order_.id));
Subquery<Integer> sq = q.subquery(Integer.class);
Root<Customer> c = sq.from(Customer.class);
@@ -263,9 +270,10 @@
+ " (select avg(o2.quantity) from Customer c, in(c.orders) o2)"
+ " and (select min(o2.quantity) from Customer c, in(c.orders)"
+ " o2)";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
Root<Order> o = q.from(Order.class);
-// q.select(o.get(Order_.id));
+ q.select(o.get(Order_.id));
Subquery<Double> sq1 = q.subquery(Double.class);
Root<Customer> c = sq1.from(Customer.class);
@@ -277,21 +285,20 @@
SetJoin<Customer, Order> o3 = c2.join(Customer_.orders);
sq2.select(cb.min(o3.get(Order_.quantity)));
- // do not know how to call between for double and integer
- // q.where(cb.between(o2.get(Order_.quantity), sq1, sq2));
+ q.where(cb.between(o2.get(Order_.quantity), sq1.as(Integer.class), sq2));
assertEquivalence(q, query);
}
public void testSubquery12() {
- String query =
- "select o.id from Customer c, in(c.orders)o "
+ String query = "select o.id from Customer c, in(c.orders)o "
+ "where o.quantity > (select sum(o2.quantity)"
+ " from c.orders o2)";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
Root<Customer> c = q.from(Customer.class);
SetJoin<Customer, Order> o = c.join(Customer_.orders);
-// q.select(o.get(Order_.id));
+ q.select(o.get(Order_.id));
Subquery<Integer> sq = q.subquery(Integer.class);
Root<Customer> sqc = sq.correlate(c);
@@ -307,10 +314,11 @@
String query = "select o1.id, c.name from Order o1, Customer c"
+ " where o1.quantity = "
+ " any(select o2.quantity from in(c.orders) o2)";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<Order> o1 = q.from(Order.class);
Join<Order, Customer> c = o1.join(Order_.customer);
-// q.select(o1.get(Order_.id), c.get(Customer_.name));
+ q.multiselect(o1.get(Order_.id), c.get(Customer_.name));
Subquery<Integer> sq = q.subquery(Integer.class);
Join<Order, Customer> sqc = sq.correlate(c);
@@ -331,11 +339,11 @@
+ "(SELECT MAX(m3.id) FROM Magazine m3 "
+ "WHERE m3.idPublisher.id = p.id)) ";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<Publisher> p = q.from(Publisher.class);
Join<Publisher, Magazine> m = p.join(Publisher_.magazineCollection,
JoinType.LEFT);
-// q.select(p, m);
+ q.multiselect(p, m);
Subquery<Integer> sq = q.subquery(Integer.class);
Root<Magazine> m2 = sq.from(Magazine.class);
@@ -376,9 +384,10 @@
+ " WHEN o2.quantity = 10 THEN false "
+ " ELSE false END from Order o2"
+ " where o.customer.id = o2.customer.id)";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
Root<Order> o = q.from(Order.class);
-// q.select(o.get(Order_.id));
+ q.select(o.get(Order_.id));
Subquery<Boolean> sq = q.subquery(Boolean.class);
Root<Order> o2 = sq.from(Order.class);
@@ -402,9 +411,10 @@
+ " (select o.quantity*2 from LineItem i, Order o"
+ " where i.quantity > 10 and o.quantity > 1000 and i.id = " +
"o.id)";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
Root<Order> o1 = q.from(Order.class);
-// q.select(o1.get(Order_.id));
+ q.select(o1.get(Order_.id));
Subquery<Integer> sq = q.subquery(Integer.class);
Root<LineItem> i = sq.from(LineItem.class);
@@ -424,9 +434,10 @@
String query = "select o.id from Order o where o.customer.name ="
+ " (select substring(o2.customer.name, 3) from Order o2"
+ " where o.customer.id = o2.customer.id)";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
Root<Order> o = q.from(Order.class);
-// q.select(o.get(Order_.customer).get(Customer_.name));
+ q.select(o.get(Order_.id));
Subquery<String> sq = q.subquery(String.class);
Root<Order> o2 = sq.from(Order.class);
@@ -444,9 +455,10 @@
public void testSubquery18() {
String query = "select o.id from Order o where o.orderTs >"
+ " (select CURRENT_TIMESTAMP from o.lineItems i)";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
Root<Order> o = q.from(Order.class);
-// q.select(o.get(Order_.id));
+ q.select(o.get(Order_.id));
Subquery<Timestamp> sq = q.subquery(Timestamp.class);
Root<Order> o2 = sq.correlate(o);
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java Tue Jun 30 13:40:17 2009
@@ -37,11 +37,16 @@
package org.apache.openjpa.persistence.criteria;
import javax.persistence.Parameter;
+import javax.persistence.Tuple;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
+import javax.persistence.criteria.ParameterExpression;
import javax.persistence.criteria.Root;
+import javax.persistence.criteria.Selection;
import javax.persistence.criteria.Subquery;
+import org.apache.openjpa.persistence.inheritance.entity.ComputerUser;
+
/**
* Tests type-strict version of Criteria API. The test scenarios are adapted
* from TestEJBQLCondExpression in
@@ -86,26 +91,24 @@
}
public void testInExpr() {
- String jpql = "SELECT o.name FROM CompUser o "
- + "WHERE o.age IN (29, 40, 10)";
+ String jpql = "SELECT o.name FROM CompUser o WHERE o.age IN (29, 40, 10)";
- CriteriaQuery<?> cq = cb.createQuery();
+ CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<CompUser> o = cq.from(CompUser.class);
cq.where(cb.in(o.get(CompUser_.age)).value(29).value(40).value(10));
-// cq.select(o.get(CompUser_.name));
+ cq.select(o.get(CompUser_.name));
assertEquivalence(cq, jpql);
}
public void testNotIn() {
- String jpql = "SELECT o.name FROM CompUser o "
- + "WHERE o.age NOT IN (29, 40, 10)";
+ String jpql = "SELECT o.name FROM CompUser o WHERE o.age NOT IN (29, 40, 10)";
- CriteriaQuery<?> cq = cb.createQuery();
+ CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<CompUser> o = cq.from(CompUser.class);
cq.where(cb.in(o.get(CompUser_.age)).value(29).value(40).value(10)
.negate());
-// cq.select(o.get(CompUser_.name));
+ cq.select(o.get(CompUser_.name));
assertEquivalence(cq, jpql);
}
@@ -114,14 +117,14 @@
String jpql = "SELECT o.computerName FROM CompUser o "
+ "WHERE o.name LIKE 'Sha%' AND o.computerName NOT IN ('PC')";
- CriteriaQuery<?> cq = cb.createQuery();
+ CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<CompUser> o = cq.from(CompUser.class);
cq.where(cb.and(
cb.like(o.get(CompUser_.name),"Sha%"),
cb.in(o.get(CompUser_.computerName)).value("PC").negate()
));
-// cq.select(o.get(CompUser_.computerName));
+ cq.select(o.get(CompUser_.computerName));
assertEquivalence(cq, jpql);
}
@@ -153,22 +156,20 @@
}
public void testLikeWithEscapeCharacter() {
- String query = "SELECT o.name FROM CompUser o "
- + "WHERE o.name LIKE :name ESCAPE '|'";
- CriteriaQuery<?> cq = cb.createQuery();
+ String query = "SELECT o.name FROM CompUser o WHERE o.name LIKE :name ESCAPE '|'";
+
+ CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<CompUser> c = cq.from(CompUser.class);
- Parameter<String> param = cb.parameter(String.class, "name");
-// cq.where(cb.like(c.get(CompUser_.name), param, '|'));
-// cq.select(c.get(CompUser_.name));
+ ParameterExpression<String> param = cb.parameter(String.class, "name");
+ cq.where(cb.like(c.get(CompUser_.name), param, '|'));
+ cq.select(c.get(CompUser_.name));
- assertEquivalence(cq, query, new String[]{"name"},
- new Object[] {"%|_%"});
+ assertEquivalence(cq, query, new String[]{"name"}, new Object[] {"%|_%"});
}
public void testNullExpression() {
- String query =
- "SELECT o.name FROM CompUser o WHERE o.age IS NOT NULL AND " +
- "o.computerName = 'PC' ";
+ String query = "SELECT o.name FROM CompUser o "
+ + "WHERE o.age IS NOT NULL AND o.computerName = 'PC'";
CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<CompUser> c = cq.from(CompUser.class);
@@ -195,8 +196,7 @@
// do not support isEmpty for array fields
public void testIsEmptyExprUsingCriteria() {
- String query =
- "SELECT o.name FROM CompUser o WHERE o.nicknames IS NOT EMPTY";
+ String query = "SELECT o.name FROM CompUser o WHERE o.nicknames IS NOT EMPTY";
CriteriaQuery<String> cq = cb.createQuery(String.class);
Root<CompUser> o = cq.from(CompUser.class);
@@ -208,17 +208,16 @@
public void testConstructorExprUsingCriteria() {
- String query =
- "SELECT NEW org.apache.openjpa.persistence.criteria.MaleUser(" +
+ String query = "SELECT NEW org.apache.openjpa.persistence.criteria.MaleUser(" +
"c.name, c.computerName, c.address, c.age, c.userid)" +
" FROM CompUser c WHERE c.name = 'Seetha'";
- CriteriaQuery<?> cq = cb.createQuery();
+ CriteriaQuery<MaleUser> cq = cb.createQuery(MaleUser.class);
Root<CompUser> c = cq.from(CompUser.class);
cq.where(cb.equal(c.get(CompUser_.name), "Seetha"));
-// cq.select(cb.select(MaleUser.class, c.get(CompUser_.name),
-// c.get(CompUser_.computerName), c.get(CompUser_.address),
-// c.get(CompUser_.age), c.get(CompUser_.userid)));
+ cq.select(cb.construct(MaleUser.class, c.get(CompUser_.name),
+ c.get(CompUser_.computerName), c.get(CompUser_.address),
+ c.get(CompUser_.age), c.get(CompUser_.userid)));
assertEquivalence(cq, query);
}
@@ -389,11 +388,11 @@
}
public void testArithmFunc2() {
- String query =
- "select SQRT(e.age) From CompUser e WHERE e.name='Seetha'";
- CriteriaQuery<?> q = cb.createQuery();
+ String query = "select SQRT(e.age) From CompUser e WHERE e.name='Seetha'";
+
+ CriteriaQuery<Double> q = cb.createQuery(Double.class);
Root<CompUser> e = q.from(CompUser.class);
-// q.select(cb.sqrt(e.get(CompUser_.age)));
+ q.select(cb.sqrt(e.get(CompUser_.age)));
q.where(cb.equal(e.get(CompUser_.name), "Seetha"));
assertEquivalence(q, query);
@@ -401,50 +400,46 @@
public void testArithmFunc3() {
- String query =
- "select MOD(e.age, 4) From CompUser e WHERE e.name='Seetha'";
- CriteriaQuery<?> q = cb.createQuery();
+ String query = "select MOD(e.age, 4) From CompUser e WHERE e.name='Seetha'";
+
+ CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
Root<CompUser> e = q.from(CompUser.class);
-// q.select(cb.mod(e.get(CompUser_.age), 4));
+ q.select(cb.mod(e.get(CompUser_.age), 4));
q.where(cb.equal(e.get(CompUser_.name), "Seetha"));
assertEquivalence(q, query);
}
public void testArithmFunc4() {
- String query = "SELECT e.name FROM CompUser e WHERE " +
- "SIZE(e.nicknames) = 6";
- CriteriaQuery<?> q = cb.createQuery();
+ String query = "SELECT e.name FROM CompUser e WHERE SIZE(e.nicknames) = 6";
+
+ CriteriaQuery<String> q = cb.createQuery(String.class);
Root<CompUser> e = q.from(CompUser.class);
- //q.where(cb.equal(cb.size(e.get(CompUser_.nicknames)), 6));
-// q.select(e.get(CompUser_.name));
+ q.where(cb.equal(cb.size(e.get(CompUser_.nicknames)), 6));
+ q.select(e.get(CompUser_.name));
assertEquivalence(q, query);
}
public void testGroupByHavingClause() {
- String query =
- "SELECT c.name FROM CompUser c GROUP BY c.name HAVING c.name " +
- "LIKE 'S%'";
+ String query = "SELECT c.name FROM CompUser c GROUP BY c.name HAVING c.name LIKE 'S%'";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<String> q = cb.createQuery(String.class);
Root<CompUser> e = q.from(CompUser.class);
q.groupBy(e.get(CompUser_.name));
q.having(cb.like(e.get(CompUser_.name), "S%"));
-// q.select(e.get(CompUser_.name));
+ q.select(e.get(CompUser_.name));
assertEquivalence(q, query);
}
public void testOrderByClause() {
- String query =
- "SELECT c.name FROM CompUser c WHERE c.name LIKE 'S%' " +
- "ORDER BY c.name";
+ String query = "SELECT c.name FROM CompUser c WHERE c.name LIKE 'S%' ORDER BY c.name";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<String> q = cb.createQuery(String.class);
Root<CompUser> e = q.from(CompUser.class);
q.where(cb.like(e.get(CompUser_.name), "S%"));
-// q.select(e.get(CompUser_.name));
+ q.select(e.get(CompUser_.name));
q.orderBy(cb.asc(e.get(CompUser_.name)));
assertEquivalence(q, query);
@@ -454,9 +449,9 @@
//To be Tested: AVG, COUNT, MAX, MIN, SUM
String query = "SELECT AVG(e.age) FROM CompUser e";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Double> q = cb.createQuery(Double.class);
Root<CompUser> e = q.from(CompUser.class);
-// q.select(cb.avg(e.get(CompUser_.age)));
+ q.select(cb.avg(e.get(CompUser_.age)));
assertEquivalence(q, query);
}
@@ -464,9 +459,9 @@
public void testCOUNTAggregFunc() {
String query = "SELECT COUNT(c.name) FROM CompUser c";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Long> q = cb.createQuery(Long.class);
Root<CompUser> e = q.from(CompUser.class);
-// q.select(cb.count(e.get(CompUser_.name)));
+ q.select(cb.count(e.get(CompUser_.name)));
assertEquivalence(q, query);
}
@@ -474,9 +469,9 @@
public void testMAXAggregFunc() {
String query = "SELECT DISTINCT MAX(c.age) FROM CompUser c";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
Root<CompUser> e = q.from(CompUser.class);
-// q.select(cb.max(e.get(CompUser_.age))).distinct(true);
+ q.select(cb.max(e.get(CompUser_.age))).distinct(true);
assertEquivalence(q, query);
}
@@ -484,9 +479,9 @@
public void testMINAggregFunc() {
String query = "SELECT DISTINCT MIN(c.age) FROM CompUser c";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
Root<CompUser> e = q.from(CompUser.class);
-// q.select(cb.min(e.get(CompUser_.age))).distinct(true);
+ q.select(cb.min(e.get(CompUser_.age))).distinct(true);
assertEquivalence(q, query);
}
@@ -494,20 +489,19 @@
public void testSUMAggregFunc() {
String query = "SELECT SUM(c.age) FROM CompUser c";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
Root<CompUser> e = q.from(CompUser.class);
-// q.select(cb.sum(e.get(CompUser_.age)));
+ q.select(cb.sum(e.get(CompUser_.age)));
assertEquivalence(q, query);
}
public void testTypeExpression1() {
- String jpql = "SELECT e FROM CompUser e where TYPE(e) in (:a, :b) " +
- "ORDER By e.name";
+ String jpql = "SELECT e FROM CompUser e where TYPE(e) in (:a, :b) ORDER By e.name";
- CriteriaQuery<?> cq = cb.createQuery();
+ CriteriaQuery<CompUser> cq = cb.createQuery(CompUser.class);
Root<CompUser> e = cq.from(CompUser.class);
-// cq.select(e);
+ cq.select(e);
Parameter<Class> param1 = cb.parameter(Class.class, "a");
Parameter<Class> param2 = cb.parameter(Class.class, "b");
cq.where(e.type().in(param1, param2));
@@ -520,27 +514,29 @@
public void testTypeExpression2() {
String query = "SELECT TYPE(e) FROM CompUser e where TYPE(e) <> :t";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<CompUser> e = q.from(CompUser.class);
Parameter<Class> param1 = cb.parameter(Class.class, "t");
-// q.select(e.type());
+ Expression<Class<? extends CompUser>> etype = e.type();
+ // how to specify the following
+ q.multiselect(e.type());
q.where(cb.equal(e.type(), param1).negate());
- assertEquivalence(q, query, new String[]{"t"},
- new Class[]{MaleUser.class});
+ assertEquivalence(q, query, new String[]{"t"}, new Class[]{MaleUser.class});
}
// Type literal
// this Cartesian problem can not be rewritten to use JOIN
public void testTypeExpression3() {
- String query = "SELECT e, FemaleUser, a FROM Address a, FemaleUser e "
- + " where e.address IS NOT NULL";
- CriteriaQuery<?> q = cb.createQuery();
+ String query = "SELECT e, FemaleUser, a FROM Address a, FemaleUser e where e.address IS NOT NULL";
+
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<Address> a = q.from(Address.class);
- // Join<Address,FemaleUser> e = a.join(Address_.user);
- // q.select(cb.literal(FemaleUser.class), e.get(CompUser_.address));
- // q.where(cb.equal(e.type(), null).negate());
+ Root<FemaleUser> e = q.from(FemaleUser.class);
+ q.multiselect(e, cb.literal(FemaleUser.class), e.get(CompUser_.address));
+ q.where(e.get(FemaleUser_.address).isNotNull());
assertEquivalence(q, query);
}
@@ -548,9 +544,9 @@
public void testTypeExpression4() {
String query = "SELECT e FROM CompUser e where TYPE(e) = MaleUser";
- CriteriaQuery<?> cq = cb.createQuery();
+ CriteriaQuery<CompUser> cq = cb.createQuery(CompUser.class);
Root<CompUser> e = cq.from(CompUser.class);
-// cq.select(e);
+ cq.select(e);
cq.where(cb.equal(e.type(), cb.literal(MaleUser.class)));
assertEquivalence(cq, query);
@@ -581,9 +577,9 @@
public void testTypeExpression7() {
String query = "SELECT TYPE(a.b) FROM A a";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<A> a = q.from(A.class);
-// q.select(a.get(A_.b).type());
+ q.multiselect(a.get(A_.b).type());
assertEquivalence(q, query);
}
@@ -591,9 +587,9 @@
public void testTypeExpression8() {
String query = "SELECT MaleUser FROM A a";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Class> q = cb.createQuery(Class.class);
Root<A> a = q.from(A.class);
-// q.select(cb.literal(MaleUser.class));
+ q.multiselect(cb.literal(MaleUser.class));
assertEquivalence(q, query);
}
@@ -602,36 +598,34 @@
String query = "SELECT "
+ " CASE TYPE(e) WHEN FemaleUser THEN 'Female' "
+ " ELSE 'Male' END FROM CompUser e";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Object> q = cb.createQuery();
Root<CompUser> e = q.from(CompUser.class);
-// q.select(cb.selectCase(e.type()).when(FemaleUser.class, "Female")
-// .otherwise("Male"));
+ q.select(cb.selectCase(e.type())
+ .when(FemaleUser.class, "Female")
+ .otherwise("Male"));
assertEquivalence(q, query);
}
public void testCoalesceExpressions() {
- String query = "SELECT e.name, "
- + "COALESCE (e.address.country, 'Unknown')"
- + " FROM CompUser e ORDER BY e.name DESC";
+ String query = "SELECT e.name, COALESCE (e.address.country, 'Unknown') FROM CompUser e ORDER BY e.name DESC";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<CompUser> e = q.from(CompUser.class);
-// q.select(e.get(CompUser_.name), cb.coalesce().value(
-// e.get(CompUser_.address).get(Address_.country))
-// .value("Unknown"));
+ q.multiselect(e.get(CompUser_.name),
+ cb.coalesce().value(e.get(CompUser_.address).get(Address_.country)).value("Unknown"));
q.orderBy(cb.desc(e.get(CompUser_.name)));
assertEquivalence(q, query);
}
public void testNullIfExpressions() {
- String query = "SELECT e.name, NULLIF (e.address.country, 'USA')"
- + " FROM CompUser e ORDER BY e.name DESC";
- CriteriaQuery<?> q = cb.createQuery();
+ String query = "SELECT e.name, NULLIF (e.address.country, 'USA') FROM CompUser e ORDER BY e.name DESC";
+
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<CompUser> e = q.from(CompUser.class);
-// q.select(e.get(CompUser_.name), cb.nullif(e.get(CompUser_.address).get(
-// Address_.country), "USA"));
+ q.multiselect(e.get(CompUser_.name),
+ cb.nullif(e.get(CompUser_.address).get(Address_.country), "USA"));
q.orderBy(cb.desc(e.get(CompUser_.name)));
assertEquivalence(q, query);
@@ -642,14 +636,15 @@
+ "CASE e.address.country WHEN 'USA' THEN 'us' "
+ " ELSE 'non-us' END, e.address.country "
+ " FROM CompUser e";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<CompUser> e = q.from(CompUser.class);
Expression<Integer> cage = cb.sum(e.get(CompUser_.age), 1);
Expression d2 = cb.selectCase(
e.get(CompUser_.address).get(Address_.country)).when("USA",
"us").otherwise("non-us");
-// q.select(e.get(CompUser_.name), cage, d2, e.get(CompUser_.address).get(
-// Address_.country));
+ q.multiselect(e.get(CompUser_.name), cage, d2, e.get(CompUser_.address).get(
+ Address_.country));
assertEquivalence(q, query);
}
@@ -660,15 +655,15 @@
+ " THEN 'United-States' "
+ " ELSE e.address.country END," + " e.address.country "
+ " FROM CompUser e";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<CompUser> e = q.from(CompUser.class);
Expression cage = cb.sum(e.get(CompUser_.age), 1);
Expression d2 = cb.selectCase(
e.get(CompUser_.address).get(Address_.country)).when("USA",
"United-States").otherwise(
e.get(CompUser_.address).get(Address_.country));
-// q.select(e.get(CompUser_.name), cage, d2, e.get(CompUser_.address).get(
-// Address_.country));
+ q.multiselect(e.get(CompUser_.name), cage, d2, e.get(CompUser_.address).get(
+ Address_.country));
assertEquivalence(q, query);
}
@@ -679,11 +674,11 @@
+ " ELSE 'Male' END"
+ " FROM CompUser e WHERE e.name like 'S%' "
+ " ORDER BY e.name DESC";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<CompUser> e = q.from(CompUser.class);
-// q.select(e.get(CompUser_.name),
-// cb.selectCase(e.type()).when(FemaleUser.class, "Female")
-// .otherwise("Male"));
+ q.multiselect(e.get(CompUser_.name),
+ cb.selectCase(e.type()).when(FemaleUser.class, "Female")
+ .otherwise("Male"));
q.where(cb.like(e.get(CompUser_.name), "S%"));
q.orderBy(cb.desc(e.get(CompUser_.name)));
@@ -694,13 +689,13 @@
String query = "SELECT e.name, CASE e.address.country WHEN 'USA'"
+ " THEN true ELSE false END,"
+ " e.address.country FROM CompUser e";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<CompUser> e = q.from(CompUser.class);
Expression b = cb.selectCase(
e.get(CompUser_.address).get(Address_.country)).when("USA",
true).otherwise(false);
-// q.select(e.get(CompUser_.name), b, e.get(CompUser_.address).get(
-// Address_.country));
+ q.multiselect(e.get(CompUser_.name), b, e.get(CompUser_.address).get(
+ Address_.country));
assertEquivalence(q, query);
}
@@ -710,14 +705,14 @@
+ " CASE WHEN e.age > 30 THEN e.age - 1 "
+ " WHEN e.age < 15 THEN e.age + 1 ELSE e.age + 0 "
+ " END FROM CompUser e";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<CompUser> e = q.from(CompUser.class);
Expression cage = cb.selectCase().when(cb.gt(e.get(CompUser_.age), 30),
cb.diff(e.get(CompUser_.age), 1)).when(
cb.lt(e.get(CompUser_.age), 15),
cb.sum(e.get(CompUser_.age), 1)).otherwise(
cb.sum(e.get(CompUser_.age), 0));
-// q.select(e.get(CompUser_.name), e.get(CompUser_.age), cage);
+ q.multiselect(e.get(CompUser_.name), e.get(CompUser_.age), cage);
assertEquivalence(q, query);
}
@@ -729,7 +724,7 @@
+ " ELSE 'Non United-States' END,"
+ " e.address.country "
+ " FROM CompUser e";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<CompUser> e = q.from(CompUser.class);
Expression d2 = cb.selectCase()
.when(
@@ -738,8 +733,8 @@
"USA"), "United-States").otherwise(
"Non United-States");
Expression cage = cb.sum(e.get(CompUser_.age), 1);
-// q.select(e.get(CompUser_.name), cage, d2, e.get(CompUser_.address).get(
-// Address_.country));
+ q.multiselect(e.get(CompUser_.name), cage, d2, e.get(CompUser_.address).get(
+ Address_.country));
assertEquivalence(q, query);
}
@@ -756,13 +751,13 @@
+ "org.apache.openjpa.persistence.criteria.CompUser$"
+ "CreditRating.EXCELLENT"
+ " END FROM CompUser e ORDER BY e.age";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<CompUser> e = q.from(CompUser.class);
-// q.select(e.get(CompUser_.name), cb.selectCase().when(
-// cb.equal(e.get(CompUser_.age), 11), CompUser.CreditRating.POOR)
-// .when(cb.equal(e.get(CompUser_.age), 35),
-// CompUser.CreditRating.GOOD).otherwise(
-// CompUser.CreditRating.EXCELLENT));
+ q.multiselect(e.get(CompUser_.name), cb.selectCase().when(
+ cb.equal(e.get(CompUser_.age), 11), CompUser.CreditRating.POOR)
+ .when(cb.equal(e.get(CompUser_.age), 35),
+ CompUser.CreditRating.GOOD).otherwise(
+ CompUser.CreditRating.EXCELLENT));
q.orderBy(cb.asc(e.get(CompUser_.age)));
@@ -787,21 +782,20 @@
+ "CreditRating.EXCELLENT"
+ " END from CompUser e1"
+ " where e.userid = e1.userid) ORDER BY e.age";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<CompUser> e = q.from(CompUser.class);
-// q.select(e.get(CompUser_.name), e.get(CompUser_.creditRating));
+ q.multiselect(e.get(CompUser_.name), e.get(CompUser_.creditRating));
q.orderBy(cb.asc(e.get(CompUser_.age)));
- Subquery<Integer> sq = q.subquery(Integer.class);
+ Subquery<Object> sq = q.subquery(Object.class);
Root<CompUser> e1 = sq.from(CompUser.class);
sq.where(cb.equal(e.get(CompUser_.userid), e1.get(CompUser_.userid)));
q.where(cb.equal(e.get(CompUser_.creditRating),
- // sq.select(
- cb.selectCase().when(cb.equal(e1.get(CompUser_.age), 11),
- CompUser.CreditRating.POOR).when(
- cb.equal(e1.get(CompUser_.age), 35),
- CompUser.CreditRating.GOOD).otherwise(
- CompUser.CreditRating.EXCELLENT)));
+ sq.select(
+ cb.selectCase()
+ .when(cb.equal(e1.get(CompUser_.age), 11), CompUser.CreditRating.POOR)
+ .when(cb.equal(e1.get(CompUser_.age), 35), CompUser.CreditRating.GOOD)
+ .otherwise(CompUser.CreditRating.EXCELLENT))));
q.orderBy(cb.asc(e.get(CompUser_.age)));