diff --git a/querydsl-hql/pom.xml b/querydsl-hql/pom.xml index ee803b6c8..a353d8a95 100644 --- a/querydsl-hql/pom.xml +++ b/querydsl-hql/pom.xml @@ -71,7 +71,7 @@ org.eclipse.persistence eclipselink - 2.1.0-M7 + 2.1.0-SNAPSHOT test @@ -81,7 +81,14 @@ ${hsqldb.version} test - + + + com.h2database + h2 + 1.2.133 + test + + org.apache.derby derby diff --git a/querydsl-hql/src/main/java/com/mysema/query/hql/HQLSerializer.java b/querydsl-hql/src/main/java/com/mysema/query/hql/HQLSerializer.java index 152bf52e3..c45b5ce80 100644 --- a/querydsl-hql/src/main/java/com/mysema/query/hql/HQLSerializer.java +++ b/querydsl-hql/src/main/java/com/mysema/query/hql/HQLSerializer.java @@ -281,6 +281,7 @@ public class HQLSerializer extends SerializerBase { } private void visitCast(Expr source, Class targetType) { + // NOT : this is not supported in JPQL, only HQL append("cast(").handle(source); append(AS); append(targetType.getSimpleName().toLowerCase(Locale.ENGLISH)).append(")"); diff --git a/querydsl-hql/src/main/java/com/mysema/query/hql/HQLTemplates.java b/querydsl-hql/src/main/java/com/mysema/query/hql/HQLTemplates.java index ee311b04e..c6123de02 100644 --- a/querydsl-hql/src/main/java/com/mysema/query/hql/HQLTemplates.java +++ b/querydsl-hql/src/main/java/com/mysema/query/hql/HQLTemplates.java @@ -65,7 +65,8 @@ public class HQLTemplates extends Templates { add(Ops.ARRAY_SIZE, "size({0})"); // string - add(Ops.CONCAT, "concat({0},{1})", 0); + add(Ops.LIKE, "{0} like {1}",1); + add(Ops.CONCAT, "concat({0},{1})",0); add(Ops.MATCHES, "{0} like {1}", 27); // TODO : support real regexes add(Ops.LOWER, "lower({0})"); add(Ops.SUBSTR_1ARG, "substring({0},{1}+1)"); @@ -82,8 +83,8 @@ public class HQLTemplates extends Templates { add(Ops.ENDS_WITH_IC, "{0l} like {%%1}"); add(Ops.STARTS_WITH, "{0} like {1%}"); add(Ops.STARTS_WITH_IC, "{0l} like {1%%}"); - add(Ops.INDEX_OF, "locate({1},{0})-1"); - add(Ops.INDEX_OF_2ARGS, "locate({1},{0},{2}+1)-1"); + add(Ops.INDEX_OF, "locate({1},{0}) - 1"); + add(Ops.INDEX_OF_2ARGS, "locate({1},{0},{2}+1) - 1"); // date time add(Ops.DateTimeOps.SYSDATE, "sysdate"); diff --git a/querydsl-hql/src/test/java/com/mysema/query/AbstractJPATest.java b/querydsl-hql/src/test/java/com/mysema/query/AbstractJPATest.java index 5dee3b30f..af6e82393 100644 --- a/querydsl-hql/src/test/java/com/mysema/query/AbstractJPATest.java +++ b/querydsl-hql/src/test/java/com/mysema/query/AbstractJPATest.java @@ -54,6 +54,32 @@ public abstract class AbstractJPATest extends AbstractStandardTest{ assertFalse(results.isEmpty()); } +// @Test +// public void testQuery(){ +// String queryStr = "select cat.name, otherCat.name " + +// "from Cat cat, Cat otherCat " + +// "where length(cat.name) > :a1 and length(otherCat.name) > :a1 and locate(otherCat.name,cat.name) - 1 > :a1"; +// +// javax.persistence.Query query = entityManager.createQuery(queryStr); +// query.setParameter("a1", 1); +// query.getResultList(); +// } + +// @Test +// public void testQuery2(){ +// String queryStr = "select cat.name, otherCat.name " + +// "from Cat cat, Cat otherCat " + +// "where length(cat.name) > :a1 and length(otherCat.name) > :a1 and " + +// "cat.name like concat(:a2,concat(substring(otherCat.name,:a3+1,:a4),:a2))"; +// +// javax.persistence.Query query = entityManager.createQuery(queryStr); +// query.setParameter("a1", 0); +// query.setParameter("a2", "XXX"); +// query.setParameter("a3",0); +// query.setParameter("a4",0); +// query.getResultList(); +// } + @Test @Override public void tupleProjection(){ diff --git a/querydsl-hql/src/test/java/com/mysema/query/EclipseLinkTemplates.java b/querydsl-hql/src/test/java/com/mysema/query/EclipseLinkTemplates.java index eac660a3c..33748704d 100644 --- a/querydsl-hql/src/test/java/com/mysema/query/EclipseLinkTemplates.java +++ b/querydsl-hql/src/test/java/com/mysema/query/EclipseLinkTemplates.java @@ -31,14 +31,18 @@ public class EclipseLinkTemplates extends HQLTemplates{ add(Ops.STARTS_WITH, "locate({1},{0})=1"); add(Ops.STARTS_WITH_IC, "locate({1l},{0l})=1"); - // EclipseLink specific + // EclipseLink specific (works at least with Derby, HSQLDB and H2) add(Ops.DateTimeOps.SECOND, "func('second',{0})"); add(Ops.DateTimeOps.MINUTE, "func('minute',{0})"); add(Ops.DateTimeOps.HOUR, "func('hour',{0})"); + add(Ops.DateTimeOps.DAY_OF_WEEK, "func('dayofweek',{0})"); add(Ops.DateTimeOps.DAY_OF_MONTH, "func('day',{0})"); + add(Ops.DateTimeOps.DAY_OF_YEAR, "func('dayofyear',{0})"); add(Ops.DateTimeOps.MONTH, "func('month',{0})"); + add(Ops.DateTimeOps.WEEK, "func('week',{0})"); add(Ops.DateTimeOps.YEAR, "func('year',{0})"); add(Ops.DateTimeOps.YEAR_MONTH, "func('year',{0}) * 100 + func('month',{0})"); + } public boolean wrapElements(Operator operator){ @@ -50,6 +54,7 @@ public class EclipseLinkTemplates extends HQLTemplates{ } public boolean isTypeAsString() { + // TODO : get rid of this when Hibernate supports type(alias) return false; } diff --git a/querydsl-hql/src/test/java/com/mysema/query/_h2/H2JPAEclipseLinkTest.java b/querydsl-hql/src/test/java/com/mysema/query/_h2/H2JPAEclipseLinkTest.java new file mode 100644 index 000000000..8e58d348b --- /dev/null +++ b/querydsl-hql/src/test/java/com/mysema/query/_h2/H2JPAEclipseLinkTest.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2009 Mysema Ltd. + * All rights reserved. + * + */ +package com.mysema.query._h2; + +import org.junit.runner.RunWith; + +import com.mysema.query.AbstractJPATest; +import com.mysema.query.EclipseLinkTemplates; +import com.mysema.query.Target; +import com.mysema.query.hql.HQLTemplates; +import com.mysema.testutil.JPAConfig; +import com.mysema.testutil.JPATestRunner; + +/** + * @author tiwe + * + */ +@RunWith(JPATestRunner.class) +@JPAConfig("h2-eclipselink") +public abstract class H2JPAEclipseLinkTest extends AbstractJPATest{ + + protected HQLTemplates getTemplates(){ + return EclipseLinkTemplates.DEFAULT; + } + + @Override + protected Target getTarget() { + return Target.H2; + } + +} diff --git a/querydsl-hql/src/test/java/com/mysema/query/_hsqldb/HSQLDBJPAEclipseLinkStandardTest.java b/querydsl-hql/src/test/java/com/mysema/query/_hsqldb/HSQLDBJPAEclipseLinkStandardTest.java new file mode 100644 index 000000000..7774bee3a --- /dev/null +++ b/querydsl-hql/src/test/java/com/mysema/query/_hsqldb/HSQLDBJPAEclipseLinkStandardTest.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2009 Mysema Ltd. + * All rights reserved. + * + */ +package com.mysema.query._hsqldb; + +import org.junit.runner.RunWith; + +import com.mysema.query.AbstractJPATest; +import com.mysema.query.EclipseLinkTemplates; +import com.mysema.query.Target; +import com.mysema.query.hql.HQLTemplates; +import com.mysema.testutil.JPAConfig; +import com.mysema.testutil.JPATestRunner; + + + +/** + * @author tiwe + * + */ +@RunWith(JPATestRunner.class) +@JPAConfig("hsqldb-eclipselink") +public abstract class HSQLDBJPAEclipseLinkStandardTest extends AbstractJPATest{ + + protected HQLTemplates getTemplates(){ + return EclipseLinkTemplates.DEFAULT; + } + + @Override + protected Target getTarget() { + return Target.HSQLDB; + } + + +} diff --git a/querydsl-hql/src/test/resources/META-INF/persistence.xml b/querydsl-hql/src/test/resources/META-INF/persistence.xml index d0a842859..fb1d6c47c 100644 --- a/querydsl-hql/src/test/resources/META-INF/persistence.xml +++ b/querydsl-hql/src/test/resources/META-INF/persistence.xml @@ -40,13 +40,39 @@ - + + + org.eclipse.persistence.jpa.PersistenceProvider + false + + + + + + + + + + + + org.eclipse.persistence.jpa.PersistenceProvider + false + + + + + + + + + + diff --git a/querydsl-hql/src/test/resources/com/mysema/testutil/mysql.properties b/querydsl-hql/src/test/resources/com/mysema/testutil/mysql.properties index 5b2a9f9e5..6e4c9b162 100644 --- a/querydsl-hql/src/test/resources/com/mysema/testutil/mysql.properties +++ b/querydsl-hql/src/test/resources/com/mysema/testutil/mysql.properties @@ -2,8 +2,8 @@ hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect hibernate.connection.driver_class=com.mysql.jdbc.Driver hibernate.connection.url=jdbc:mysql://localhost:3306/querydsl -hibernate.connection.username=root -hibernate.connection.password= +hibernate.connection.username=querydsl +hibernate.connection.password=querydsl ## Common properties hibernate.show_sql=true diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/dml/SQLInsertClause.java b/querydsl-sql/src/main/java/com/mysema/query/sql/dml/SQLInsertClause.java index f45d0b2b2..101397130 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/dml/SQLInsertClause.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/dml/SQLInsertClause.java @@ -52,8 +52,7 @@ public class SQLInsertClause implements InsertClause { private final List> values = new ArrayList>(); - public SQLInsertClause(Connection connection, SQLTemplates templates, - PEntity entity) { + public SQLInsertClause(Connection connection, SQLTemplates templates, PEntity entity) { this.connection = connection; this.templates = templates; this.entity = entity; diff --git a/querydsl-sql/src/test/java/com/mysema/query/AbstractBaseTest.java b/querydsl-sql/src/test/java/com/mysema/query/AbstractBaseTest.java index 9f5d03b98..a7ab998f6 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/AbstractBaseTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/AbstractBaseTest.java @@ -17,6 +17,10 @@ import com.mysema.query.sql.SQLQuery; import com.mysema.query.sql.SQLQueryImpl; import com.mysema.query.sql.SQLSubQuery; import com.mysema.query.sql.SQLTemplates; +import com.mysema.query.sql.dml.SQLDeleteClause; +import com.mysema.query.sql.dml.SQLInsertClause; +import com.mysema.query.sql.dml.SQLUpdateClause; +import com.mysema.query.types.path.PEntity; public abstract class AbstractBaseTest { @@ -29,7 +33,19 @@ public abstract class AbstractBaseTest { @Nullable protected String expectedQuery; - + + protected SQLUpdateClause update(PEntity e){ + return new SQLUpdateClause(Connections.getConnection(), dialect, e); + } + + protected SQLInsertClause insert(PEntity e){ + return new SQLInsertClause(Connections.getConnection(), dialect, e); + } + + protected SQLDeleteClause delete(PEntity e){ + return new SQLDeleteClause(Connections.getConnection(), dialect, e); + } + protected SQLQuery query() { return new SQLQueryImpl(Connections.getConnection(), dialect) { @Override diff --git a/querydsl-sql/src/test/java/com/mysema/query/Connections.java b/querydsl-sql/src/test/java/com/mysema/query/Connections.java index 113c83f57..7e5f907d0 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/Connections.java +++ b/querydsl-sql/src/test/java/com/mysema/query/Connections.java @@ -85,7 +85,7 @@ public final class Connections { private static Connection getMySQL() throws SQLException, ClassNotFoundException { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/querydsl"; - return DriverManager.getConnection(url, "root", ""); + return DriverManager.getConnection(url, "querydsl", "querydsl"); } private static Connection getOracle() throws SQLException, ClassNotFoundException{ diff --git a/querydsl-sql/src/test/java/com/mysema/query/InsertBaseTest.java b/querydsl-sql/src/test/java/com/mysema/query/InsertBaseTest.java index 0045ab8aa..37bcaecb2 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/InsertBaseTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/InsertBaseTest.java @@ -5,7 +5,6 @@ */ package com.mysema.query; -import static com.mysema.query.Connections.getConnection; import static com.mysema.query.Constants.survey; import static com.mysema.query.Constants.survey2; @@ -16,25 +15,15 @@ import org.junit.Before; import org.junit.Test; import com.mysema.query.sql.SQLSubQuery; -import com.mysema.query.sql.dml.SQLDeleteClause; import com.mysema.query.sql.dml.SQLInsertClause; import com.mysema.query.sql.domain.QEmployee; import com.mysema.query.sql.domain.QSurvey; -import com.mysema.query.types.path.PEntity; public abstract class InsertBaseTest extends AbstractBaseTest{ - - protected SQLInsertClause insert(PEntity e){ - return new SQLInsertClause(getConnection(), dialect, e); - } - - protected SQLDeleteClause delete(PEntity e){ - return new SQLDeleteClause(Connections.getConnection(), dialect, e); - } private void reset() throws SQLException{ delete(survey).where(survey.name.isNotNull()).execute(); - Connections.getStatement().execute("insert into survey values (1, 'Hello World')"); + insert(survey).values(1, "Hello World").execute(); } @Before diff --git a/querydsl-sql/src/test/java/com/mysema/query/UpdateBaseTest.java b/querydsl-sql/src/test/java/com/mysema/query/UpdateBaseTest.java index ac757c918..9aa63738a 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/UpdateBaseTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/UpdateBaseTest.java @@ -9,7 +9,6 @@ import static com.mysema.query.Constants.survey; import static org.junit.Assert.assertEquals; import java.sql.SQLException; -import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -17,24 +16,13 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import com.mysema.query.sql.dml.SQLDeleteClause; -import com.mysema.query.sql.dml.SQLUpdateClause; import com.mysema.query.types.Path; -import com.mysema.query.types.path.PEntity; public abstract class UpdateBaseTest extends AbstractBaseTest{ - protected SQLUpdateClause update(PEntity e){ - return new SQLUpdateClause(Connections.getConnection(), dialect, e); - } - - protected SQLDeleteClause delete(PEntity e){ - return new SQLDeleteClause(Connections.getConnection(), dialect, e); - } - - private void reset() throws SQLException{ + protected void reset() throws SQLException{ delete(survey).where(survey.name.isNotNull()).execute(); - Connections.getStatement().execute("insert into survey values (1, 'Hello World')"); + insert(survey).values(1, "Hello World").execute(); } @Before diff --git a/querydsl-sql/src/test/java/com/mysema/testutil/FilteringTestRunner.java b/querydsl-sql/src/test/java/com/mysema/testutil/FilteringTestRunner.java index bf069e3f3..45eca4889 100644 --- a/querydsl-sql/src/test/java/com/mysema/testutil/FilteringTestRunner.java +++ b/querydsl-sql/src/test/java/com/mysema/testutil/FilteringTestRunner.java @@ -45,8 +45,9 @@ public class FilteringTestRunner extends JUnit4ClassRunner { @Override public void run(final RunNotifier notifier) { - if (run) + if (run){ super.run(notifier); + } } protected TestMethod wrapMethod(Method method) {