diff --git a/querydsl-jdoql/pom.xml b/querydsl-jdoql/pom.xml
index a15e86c9b..4799dbe7a 100644
--- a/querydsl-jdoql/pom.xml
+++ b/querydsl-jdoql/pom.xml
@@ -157,8 +157,28 @@
-
-
+
+
+ com.mysema.querydsl
+ querydsl-maven-plugin
+ ${project.version}
+
+ org.hsqldb.jdbcDriver
+ jdbc:hsqldb:target/jdo
+ com.mysema.query.jdoql.test.domain.sql
+ sa
+ src/test/java
+ S
+
+
+
+ hsqldb
+ hsqldb
+ 1.8.0.7
+
+
+
+
diff --git a/querydsl-jdoql/src/main/java/com/mysema/query/jdoql/sql/JDOSQLQuery.java b/querydsl-jdoql/src/main/java/com/mysema/query/jdoql/sql/JDOSQLQuery.java
index eebc0d8d9..342c7a615 100644
--- a/querydsl-jdoql/src/main/java/com/mysema/query/jdoql/sql/JDOSQLQuery.java
+++ b/querydsl-jdoql/src/main/java/com/mysema/query/jdoql/sql/JDOSQLQuery.java
@@ -16,6 +16,9 @@ import javax.annotation.Nullable;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import com.mysema.commons.lang.CloseableIterator;
import com.mysema.query.DefaultQueryMetadata;
import com.mysema.query.QueryException;
@@ -39,6 +42,8 @@ import com.mysema.util.ResultIterator;
*
*/
public final class JDOSQLQuery extends AbstractSQLQuery implements SQLCommonQuery, Closeable{
+
+ private static final Logger logger = LoggerFactory.getLogger(JDOSQLQuery.class);
private final boolean detach;
@@ -88,7 +93,10 @@ public final class JDOSQLQuery extends AbstractSQLQuery implements
serializer.serialize(queryMixin.getMetadata(), forCount);
// create Query
- Query query = persistenceManager.newQuery(serializer.toString());
+ if (logger.isDebugEnabled()){
+ logger.debug(serializer.toString());
+ }
+ Query query = persistenceManager.newQuery("javax.jdo.query.SQL",serializer.toString());
orderedConstants = serializer.getConstants();
queries.add(query);
@@ -100,6 +108,8 @@ public final class JDOSQLQuery extends AbstractSQLQuery implements
} else if (exprType.equals(EConstructor.class)){
query.setResultClass(projection.get(0).getType());
}
+ }else{
+ query.setResultClass(Long.class);
}
return query;
@@ -164,7 +174,6 @@ public final class JDOSQLQuery extends AbstractSQLQuery implements
queryMixin.addToProjection(expr);
Query countQuery = createQuery(true);
countQuery.setUnique(true);
- countQuery.setResult("count(this)");
long total = (Long) execute(countQuery);
if (total > 0) {
QueryModifiers modifiers = queryMixin.getMetadata().getModifiers();
diff --git a/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/AbstractJDOTest.java b/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/AbstractJDOTest.java
index a3aa362b7..d305ef4b3 100644
--- a/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/AbstractJDOTest.java
+++ b/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/AbstractJDOTest.java
@@ -25,7 +25,7 @@ import com.mysema.query.types.path.PEntity;
public abstract class AbstractJDOTest {
private static final JDOQLTemplates templates = new JDOQLTemplates();
-
+
protected static PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("datanucleus.properties");
protected PersistenceManager pm;
@@ -48,10 +48,6 @@ public abstract class AbstractJDOTest {
return query().from(source).where(condition).list(source);
}
-// protected JDOQLUpdateClause update(PEntity> entity) {
-// return new JDOQLUpdateClause(pm, entity, templates);
-// }
-
protected JDOQLDeleteClause delete(PEntity> entity) {
return new JDOQLDeleteClause(pm, entity, templates);
}
@@ -80,7 +76,6 @@ public abstract class AbstractJDOTest {
tx.begin();
pm.newQuery(Store.class).deletePersistentAll();
pm.newQuery(Product.class).deletePersistentAll();
-
tx.commit();
} finally {
if (tx.isActive()) {
diff --git a/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/JDOSQLQueryTest.java b/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/JDOSQLQueryTest.java
new file mode 100644
index 000000000..81caedb51
--- /dev/null
+++ b/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/JDOSQLQueryTest.java
@@ -0,0 +1,131 @@
+package com.mysema.query.jdoql;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.List;
+
+import javax.jdo.PersistenceManager;
+import javax.jdo.Transaction;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.mysema.query.SearchResults;
+import com.mysema.query.jdoql.sql.JDOSQLQuery;
+import com.mysema.query.jdoql.test.domain.sql.SProduct;
+import com.mysema.query.jdoql.testdomain.Product;
+import com.mysema.query.sql.HSQLDBTemplates;
+import com.mysema.query.sql.SQLTemplates;
+import com.mysema.query.types.EConstructor;
+import com.mysema.query.types.expr.EBoolean;
+
+public class JDOSQLQueryTest extends AbstractJDOTest{
+
+ private final SQLTemplates sqlTemplates = new HSQLDBTemplates();
+
+ private JDOSQLQuery sql(){
+ return new JDOSQLQuery(pm, sqlTemplates);
+ }
+
+
+ @Test
+ public void count(){
+ SProduct product = SProduct.product;
+
+ // total
+ assertEquals(30l, sql().from(product).count());
+
+ // startsWith
+ assertEquals(10l, sql().from(product).where(product.name.startsWith("A")).count());
+ assertEquals(10l, sql().from(product).where(product.name.startsWith("B")).count());
+ assertEquals(10l, sql().from(product).where(product.name.startsWith("C")).count());
+
+ // eq
+ for (int i = 0; i < 10; i++) {
+ assertEquals(1l, sql().from(product).where(product.name.eq("A"+i)).count());
+ assertEquals(1l, sql().from(product).where(product.name.eq("B"+i)).count());
+ assertEquals(1l, sql().from(product).where(product.name.eq("C"+i)).count());
+ }
+
+ }
+
+
+
+ @Test
+ public void scalarQueries(){
+ SProduct product = SProduct.product;
+ EBoolean filter = product.name.startsWith("A");
+
+ // count
+ assertEquals(10l, sql().from(product).where(filter).count());
+
+ // countDistinct
+ assertEquals(10l, sql().from(product).where(filter).countDistinct());
+
+ // list
+ assertEquals(10, sql().from(product).where(filter).list(product.name).size());
+
+ // list with limit
+ assertEquals(3, sql().from(product).limit(3).list(product.name).size());
+
+ // list with offset
+// assertEquals(7, sql().from(product).offset(3).list(product.name).size());
+
+ // list with limit and offset
+ assertEquals(3, sql().from(product).offset(3).limit(3).list(product.name).size());
+
+ // list multiple
+ for (Object[] row : sql().from(product).list(product.productId, product.name, product.amount)){
+ assertNotNull(row[0]);
+ assertNotNull(row[1]);
+ assertNotNull(row[2]);
+ }
+
+ // listResults
+ SearchResults results = sql().from(product).limit(3).listResults(product.name);
+ assertEquals(3, results.getResults().size());
+ assertEquals(30l, results.getTotal());
+
+ }
+
+ @Test
+ public void entityProjections(){
+ SProduct product = SProduct.product;
+
+ List products = sql()
+ .from(product)
+ .list(EConstructor.create(Product.class, product.name, product.description, product.price, product.amount));
+ assertEquals(30, products.size());
+ for (Product p : products){
+ assertNotNull(p.getName());
+ assertNotNull(p.getDescription());
+ assertNotNull(p.getPrice());
+ assertNotNull(p.getAmount());
+ }
+ }
+
+ @BeforeClass
+ public static void doPersist() {
+ // Persistence of a Product and a Book.
+ PersistenceManager pm = pmf.getPersistenceManager();
+ Transaction tx = pm.currentTransaction();
+ try {
+ tx.begin();
+ for (int i = 0; i < 10; i++) {
+ pm.makePersistent(new Product("C" + i, "F", 200.00, 2));
+ pm.makePersistent(new Product("B" + i, "E", 400.00, 4));
+ pm.makePersistent(new Product("A" + i, "D", 600.00, 6));
+ }
+ tx.commit();
+ } finally {
+ if (tx.isActive()) {
+ tx.rollback();
+ }
+ pm.close();
+ }
+ System.out.println("");
+
+ }
+
+}
diff --git a/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/test/domain/sql/SBook.java b/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/test/domain/sql/SBook.java
new file mode 100644
index 000000000..092d6148d
--- /dev/null
+++ b/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/test/domain/sql/SBook.java
@@ -0,0 +1,55 @@
+package com.mysema.query.jdoql.test.domain.sql;
+
+import static com.mysema.query.types.path.PathMetadataFactory.forVariable;
+
+import com.mysema.query.sql.ForeignKey;
+import com.mysema.query.sql.PrimaryKey;
+import com.mysema.query.sql.Table;
+import com.mysema.query.types.Expr;
+import com.mysema.query.types.PathMetadata;
+import com.mysema.query.types.custom.CSimple;
+import com.mysema.query.types.path.PEntity;
+import com.mysema.query.types.path.PNumber;
+import com.mysema.query.types.path.PString;
+
+
+/**
+ * SBook is a Querydsl query type for SBook
+ */
+@Table(value="BOOK")
+public class SBook extends PEntity {
+
+ private static final long serialVersionUID = -1566558053;
+
+ public static final SBook book = new SBook("BOOK");
+
+ public final PString author = createString("AUTHOR");
+
+ public final PNumber bookId = createNumber("BOOK_ID", Long.class);
+
+ public final PString isbn = createString("ISBN");
+
+ public final PString publisher = createString("PUBLISHER");
+
+ public final PrimaryKey sysIdx65 = new PrimaryKey(this, bookId);
+
+ public final ForeignKey bookFk1 = new ForeignKey(this, bookId, "PRODUCT_ID");
+
+ public SBook(String variable) {
+ super(SBook.class, forVariable(variable));
+ }
+
+ public SBook(PEntity extends SBook> entity) {
+ super(entity.getType(),entity.getMetadata());
+ }
+
+ public SBook(PathMetadata> metadata) {
+ super(SBook.class, metadata);
+ }
+
+ public Expr