diff --git a/querydsl-hibernate/pom.xml b/querydsl-hibernate/pom.xml
index 4f992d41f..1e32473bd 100644
--- a/querydsl-hibernate/pom.xml
+++ b/querydsl-hibernate/pom.xml
@@ -75,6 +75,7 @@
1.0.15
+ dummy-domain
generate-test-sources
testExecute
@@ -90,16 +91,38 @@
true
-Ainclude=src/test/includes/instances.txt,
- -AdestClass=com.mysema.query.grammar.hql.domain.Domain,
+ -AdestClass=com.mysema.query.Domain1,
-AnamePrefix=
-
-
- com/mysema/query/grammar/hql/domain/*.java
-
-
+
+ com/mysema/query/grammar/hql/domain/*.java
+
+
+ thinglink-domain
+ generate-test-sources
+
+ testExecute
+
+
+
+ src/test/java
+
+ true
+ true
+ com.mysema.query.apt.APTFactory
+ target/generated-test-sources/java
+ true
+
+ -AdestClass=com.mysema.query.Domain2,
+ -AnamePrefix=
+
+
+ com/mysema/query/grammar/hql/domain2/*.java
+
+
+
diff --git a/querydsl-hibernate/src/main/java/com/mysema/query/grammar/HqlSerializer.java b/querydsl-hibernate/src/main/java/com/mysema/query/grammar/HqlSerializer.java
index 051d71787..61ceca764 100644
--- a/querydsl-hibernate/src/main/java/com/mysema/query/grammar/HqlSerializer.java
+++ b/querydsl-hibernate/src/main/java/com/mysema/query/grammar/HqlSerializer.java
@@ -9,7 +9,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import com.mysema.query.QueryBase.JoinExpression;
+import com.mysema.query.JoinExpression;
import com.mysema.query.grammar.HqlGrammar.Constructor;
import com.mysema.query.grammar.HqlGrammar.CountExpr;
import com.mysema.query.grammar.Types.*;
@@ -75,7 +75,7 @@ public class HqlSerializer extends VisitorAdapter{
}
// type specifier
if (je.target instanceof PathEntity && !je.target.toString().contains(".")){
- _append(((PathEntity>)je.target)._type().getSimpleName())._append(" ");
+ _append(((PathEntity>)je.target).getType().getSimpleName())._append(" ");
}
handle(je.target);
if (je.conditions != null){
@@ -126,7 +126,7 @@ public class HqlSerializer extends VisitorAdapter{
}
protected void visit(Constructor> expr){
- _append("new ")._append(expr._type().getName())._append("(");
+ _append("new ")._append(expr.getType().getName())._append("(");
_append(", ",Arrays.asList(expr.args))._append(")");
}
@@ -153,4 +153,14 @@ public class HqlSerializer extends VisitorAdapter{
_append(expr.toString());
}
+ @Override
+ protected void visit(SubQuery> subQuery) {
+ _append("(");
+ _append("\n select ").handle(subQuery._select());
+ _append("\n from ")._append(", ", subQuery._from());
+ _append("\n where ")._append(" and ", subQuery._where());
+ _append(")");
+
+ }
+
}
diff --git a/querydsl-hibernate/src/main/java/com/mysema/query/hibernate/HqlQuery.java b/querydsl-hibernate/src/main/java/com/mysema/query/hibernate/HqlQuery.java
index 952836edd..e7f418390 100644
--- a/querydsl-hibernate/src/main/java/com/mysema/query/hibernate/HqlQuery.java
+++ b/querydsl-hibernate/src/main/java/com/mysema/query/hibernate/HqlQuery.java
@@ -58,6 +58,10 @@ public class HqlQuery extends HqlQueryBase{
return query;
}
+ /**
+ * TODO : replace this with Hibernate Criteria based usage
+ */
+ @Deprecated
public HqlQuery forExample(PathEntity> entity, Map map) {
select(entity).from(entity);
try {
diff --git a/querydsl-hibernate/src/test/includes/instances.txt b/querydsl-hibernate/src/test/includes/instances.txt
index 9be9e2ad5..d19d614e4 100644
--- a/querydsl-hibernate/src/test/includes/instances.txt
+++ b/querydsl-hibernate/src/test/includes/instances.txt
@@ -1,4 +1,5 @@
- // AuditLog
+
+ // AuditLog
public static final AuditLog log = new AuditLog("log");
// Cat
@@ -55,4 +56,5 @@
public static final User user2 = new User("user2");
public static final User user3 = new User("user3");
public static final User user4 = new User("user4");
- public static final User user5 = new User("user5");
\ No newline at end of file
+ public static final User user5 = new User("user5");
+
\ No newline at end of file
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/ComplexQueriesTest.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/ComplexQueriesTest.java
index f9211d60f..0d222147e 100644
--- a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/ComplexQueriesTest.java
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/ComplexQueriesTest.java
@@ -1,10 +1,19 @@
package com.mysema.query.grammar.hql;
-import static com.mysema.query.grammar.HqlGrammar.*;
-import static com.mysema.query.grammar.hql.domain.Domain.*;
+import static com.mysema.query.Domain1.catalog;
+import static com.mysema.query.Domain1.item;
+import static com.mysema.query.Domain1.order;
+import static com.mysema.query.Domain1.price;
+import static com.mysema.query.Domain1.product;
+import static com.mysema.query.grammar.Grammar.not;
+import static com.mysema.query.grammar.HqlGrammar.count;
+import static com.mysema.query.grammar.HqlGrammar.sum;
+import static com.mysema.query.grammar.HqlGrammar.sysdate;
+
import org.junit.Test;
import com.mysema.query.grammar.HqlQueryBase;
+import com.mysema.query.grammar.hql.domain.Catalog;
import com.mysema.query.grammar.hql.domain.Customer;
import com.mysema.query.grammar.hql.domain.Product;
@@ -52,7 +61,7 @@ public class ComplexQueriesTest extends HqlQueryBase{
catalog.effectiveDate.lt(sysdate()), // lt as static method
catalog.effectiveDate.goe(sysdate())) // goe as static method
.groupBy(order)
- .having(gt(sum(price.amount), minAmount))
+ .having(sum(price.amount).gt(minAmount))
.orderBy(sum(price.amount).desc());
}
@@ -70,7 +79,25 @@ public class ComplexQueriesTest extends HqlQueryBase{
// and catalog = :currentCatalog
// group by order
// having sum(price.amount) > :minAmount
-// order by sum(price.amount) desc
+// order by sum(price.amount) desc
+ Customer c = new Customer();
+ Product p = new Product();
+ Catalog currentCatalog = new Catalog();
+ long minAmount = 0l;
+
+ select(order.id, sum(price.amount), count(item))
+ .from(order)
+ .innerJoin(order.lineItems.as(item))
+ .innerJoin(item.product.as(product))
+ .join(catalog)
+ .innerJoin(catalog.prices.as(price))
+ .where(not(order.paid),
+ order.customer.eq(c),
+ price.product.eq(p),
+ catalog.eq(currentCatalog))
+ .groupBy(order)
+ .having(sum(price.amount).gt(minAmount))
+ .orderBy(sum(price.amount).desc());
}
@Test
@@ -89,7 +116,7 @@ public class ComplexQueriesTest extends HqlQueryBase{
// and statusChange.user <> :currentUser
// )
// group by status.name, status.sortOrder
-// order by status.sortOrder
+// order by status.sortOrder
}
@Test
@@ -115,6 +142,7 @@ public class ComplexQueriesTest extends HqlQueryBase{
@Test
public void testExample6(){
+
// select account, payment
// from Account as account
// join account.holder.users as user
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/FeaturesTest.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/FeaturesTest.java
index c7483e8e7..41bff208b 100644
--- a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/FeaturesTest.java
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/FeaturesTest.java
@@ -2,17 +2,17 @@ package com.mysema.query.grammar.hql;
import static com.mysema.query.grammar.Grammar.*;
import static com.mysema.query.grammar.HqlGrammar.*;
-import static com.mysema.query.grammar.hql.domain.Domain.*;
+import static com.mysema.query.Domain1.*;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
+import com.mysema.query.grammar.HqlGrammar;
import com.mysema.query.grammar.HqlQueryBase;
import com.mysema.query.grammar.HqlSerializer;
import com.mysema.query.grammar.HqlGrammar.Constructor;
import com.mysema.query.grammar.Types.Expr;
-import com.mysema.query.grammar.Types.PathEntityCollection;
-import com.mysema.query.grammar.hql.domain.Cat;
+
/**
* FeaturesTest provides
@@ -236,7 +236,7 @@ public class FeaturesTest extends HqlQueryBase{
@Test
public void testStringConcatenations(){
// string concatenation ...||... or concat(...,...)
- toString("cat.name || kitten.name", concat(cat.name, kitten.name));
+ toString("cat.name || kitten.name", cat.name.concat(kitten.name));
}
// coalesce() and nullif()
@@ -248,11 +248,21 @@ public class FeaturesTest extends HqlQueryBase{
@Test
public void testStringOperationsInFunctionalWay(){
- toString("cat.name || cust.name.firstName", concat(cat.name,cust.name().firstName));
+ toString("cat.name || cust.name.firstName", cat.name.concat(cust.name().firstName));
toString("cat.name like :a1",cat.name.like("A%"));
toString("lower(cat.name)",cat.name.lower());
}
+ @Test
+ public void testSubQuery(){
+ StringBuilder b = new StringBuilder();
+ b.append("(");
+ b.append("\n select cust.name");
+ b.append("\n from cust");
+ b.append("\n where cust.name is not null)");
+ toString(b.toString(), HqlGrammar.select(cust.name).from(cust).where(cust.name.isnotnull()));
+ }
+
@Test
public void testToString(){
toString("cat", cat);
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/SimpleQueriesTest.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/SimpleQueriesTest.java
index e9762debb..5a24267b9 100644
--- a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/SimpleQueriesTest.java
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/SimpleQueriesTest.java
@@ -1,7 +1,7 @@
package com.mysema.query.grammar.hql;
import static com.mysema.query.grammar.HqlGrammar.*;
-import static com.mysema.query.grammar.hql.domain.Domain.*;
+import static com.mysema.query.Domain1.*;
import static org.junit.Assert.assertEquals;
import java.util.Date;
@@ -41,10 +41,10 @@ public class SimpleQueriesTest extends HqlQueryBase{
where(be);
with(be);
// select(cat.name.as("cat_name")); // not allowed
- from(cat,cust).where(gt(cat.name,cust.name().firstName));
+ from(cat,cust).where(cat.name.gt(cust.name().firstName));
select(cat.name.lower()).from(cat).where(cat.name.substring(0,2).eq("Mi"));
select(cat.name.upper()).from(cat);
- select(concat(cat.name.lower(),cat.mate().name)).from(cat);
+ select(cat.name.lower().concat(cat.mate().name)).from(cat);
// cat.as(company); // not allowed
// asc(cust.name()); // not allowed
cust.name().firstName.asc();
@@ -57,12 +57,12 @@ public class SimpleQueriesTest extends HqlQueryBase{
@Test
public void testOperations(){
- gt(kitten.bodyWeight, 10);
+ kitten.bodyWeight.gt(10);
kitten.bodyWeight.lt(10);
- goe(kitten.bodyWeight, 10);
+ kitten.bodyWeight.goe(10);
kitten.bodyWeight.loe(10);
- gt(cat.name, "ABC");
+ cat.name.gt("ABC");
cust.name().firstName.lt("Albert");
cust.name().firstName.lower();
cust.name().firstName.upper();
@@ -76,7 +76,7 @@ public class SimpleQueriesTest extends HqlQueryBase{
// from Cat as cat left join cat.kittens as kitten
// with kitten.bodyWeight > 10.0
from(cat).leftJoin(cat.kittens.as(kitten))
- .with(gt(kitten.bodyWeight,10));
+ .with(kitten.bodyWeight.gt(10));
expect("from Cat cat\nleft join cat.kittens as kitten\n"+
"with kitten.bodyWeight > :a1");
}
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/ThingLinkQueriesTest.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/ThingLinkQueriesTest.java
new file mode 100644
index 000000000..e227ccc2b
--- /dev/null
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/ThingLinkQueriesTest.java
@@ -0,0 +1,50 @@
+package com.mysema.query.grammar.hql;
+
+import org.junit.Test;
+
+import com.mysema.query.grammar.HqlQueryBase;
+import com.mysema.query.Domain2;
+import static com.mysema.query.grammar.HqlGrammar.*;
+
+/**
+ * ThingLinkQueriesTest provides
+ *
+ * @author tiwe
+ * @version $Id$
+ */
+public class ThingLinkQueriesTest extends HqlQueryBase{
+
+ private Domain2.Association a = new Domain2.Association("a");
+ private Domain2.Tag g = new Domain2.Tag("g");
+ private Domain2.Thing h = new Domain2.Thing("h");
+ private Domain2.Thing t = new Domain2.Thing("t");
+
+ @Test
+ public void testQuery1(){
+// "select g._keyword, count(g._keyword) from " + Thing.class.getName()
+// + " h inner join h._tags as g where h._code in" + "(select t._code from "
+// + Association.class.getName() + " a " + "inner join a._thing as t "
+// + "where a._association = :association "
+// + "and t._isHidden = :hidden) group by g._keyword order by count(g._keyword) desc");
+
+// select(g._keyword, count(g._keyword))
+// .from(h).innerJoin(h._tags.as(g))
+// .where(h._code.in(
+// select(t._code).from(a
+
+ }
+
+ public void testQuery2(){
+// "select g._keyword, count(g._keyword) from "
+// + Thing.class.getName()
+// + " h inner join h._tags as g where h._code in"
+// + "(select t._code from "
+// + Association.class.getName()
+// + " a "
+// + "inner join a._thing as t "
+// + "where a._association = :association "
+// + "and t._isHidden = :hidden and t._timeStamp > :lastweek)
+// group by g._keyword order by count(g._keyword) desc");
+ }
+
+}
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain/EvilType.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain/EvilType.java
index 5ee725232..da5b71073 100644
--- a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain/EvilType.java
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain/EvilType.java
@@ -10,6 +10,6 @@ import javax.persistence.Entity;
*/
@Entity
public class EvilType {
- protected EvilType isnull, isnotnull, asc, desc, get, _type, path, _parent;
+ protected EvilType isnull, isnotnull, asc, desc, get, getType, getMetadata;
protected EvilType toString, hashCode, getClass, notify, notifyAll, wait;
}
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Association.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Association.java
new file mode 100644
index 000000000..56e84beca
--- /dev/null
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Association.java
@@ -0,0 +1,83 @@
+/**
+ *
+ */
+package com.mysema.query.grammar.hql.domain2;
+
+import javax.persistence.Entity;
+import javax.persistence.OneToOne;
+
+/**
+ * An Association represents a relationship between a Thing an a User. For
+ * example a User can like, hate or sell a Thing. (see thinglink-2.0 datamodel)
+ *
+ *
+ */
+@Entity
+// @Table(uniqueConstraints={@UniqueConstraint(columnNames={ "user", "thing",
+// "association" })})
+public class Association extends TimeStamped {
+
+ @OneToOne
+ private User _user;
+
+ @OneToOne
+ private Thing _thing;
+
+ private AssociationType _association;
+
+ public enum AssociationType {
+ LIKE, COLLECT, MAKE, OWN, SWAP, GIVE, HATE, SELL, WANT, LOVE, LINKED;
+ }
+
+ public Association() {
+ }
+
+ /**
+ * @param user
+ * The User the Association is related to.
+ * @param thing
+ * The Thing the Association is related to.
+ * @param association
+ * The type of the Association.
+ */
+ public Association(User user, Thing thing, AssociationType association) {
+ _user = user;
+ _thing = thing;
+ _association = association;
+ }
+
+ /**
+ * @return The User the Association is related to.
+ */
+ public User getUser() {
+ return _user;
+ }
+
+ /**
+ * @return The Thing the Association is related to.
+ */
+ public Thing getThing() {
+ return _thing;
+ }
+
+ /**
+ * @return The type of the Association.
+ */
+ public AssociationType getAssociation() {
+ return _association;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object association) {
+ boolean sameUser = ((Association) association).getUser().equals(_user);
+ boolean sameThing = ((Association) association).getThing().equals(_thing);
+ boolean sameType = ((Association) association).getAssociation().equals(_association);
+ return (sameUser && sameThing && sameType);
+ }
+
+}
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/BaseEntity.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/BaseEntity.java
new file mode 100644
index 000000000..4c74cc8a6
--- /dev/null
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/BaseEntity.java
@@ -0,0 +1,26 @@
+package com.mysema.query.grammar.hql.domain2;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+
+
+/**
+ * BaseEntity is the top of entity hierarchy. (see thinglink-2.0 datamodel)
+ *
+ */
+@MappedSuperclass
+public class BaseEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ protected Long _id;
+
+ /**
+ * @return The id of the entity.
+ */
+ public Long getId() {
+ return _id;
+ }
+}
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Comment.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Comment.java
new file mode 100644
index 000000000..e5eb88214
--- /dev/null
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Comment.java
@@ -0,0 +1,99 @@
+/**
+ *
+ */
+package com.mysema.query.grammar.hql.domain2;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+/**
+ * A comment is Created by a User and belongs to a Thing. A Thing has a List
+ * with its comments. (see thinglink-2.0 datamodel)
+ *
+ *
+ */
+@Entity
+public class Comment extends TimeStamped {
+
+ @Column(length = 500)
+ private String _userName;
+
+ @Column(length = 500)
+ private String _userEmail;
+
+ @Column(length = 15000)
+ private String _text;
+
+ private Boolean _isNew;
+
+ public Comment() {
+ }
+
+ /**
+ * Calls super() to create timeStamp. _isNew is initialized with true.
+ *
+ * @param userName
+ * Name of the user who created the Comment.
+ * @param text
+ * The comment.
+ */
+ public Comment(String userName, String text) {
+ super();
+ _userName = userName;
+ _text = text;
+ _isNew = new Boolean(true);
+ }
+
+ /**
+ * @return Name of the user who created the Comment.
+ */
+ public String getUserName() {
+ return _userName;
+ }
+
+ public void setUserEmail(String userEmail) {
+ _userEmail = userEmail;
+ }
+
+ /**
+ * @return EMail of the user who created the Comment.
+ */
+ public String getUserEmail() {
+ return _userEmail;
+ }
+
+ /**
+ * @return Text of the Comment.
+ */
+ public String getText() {
+ return _text;
+ }
+
+ /**
+ * @param text
+ * Text of the Comment.
+ */
+ public void setText(String text) {
+ _text = text;
+ }
+
+ /**
+ * Call this method, when the User has read the Comment.
+ */
+ public void setOld() {
+ _isNew = new Boolean(false);
+ }
+
+ /**
+ * @return False, when the User has read the Comment.
+ */
+ public Boolean isNew() {
+ return _isNew;
+ }
+
+ @Override
+ public boolean equals(Object comment) {
+ return ((((Comment) comment).getUserName().equals(_userName)) && (((Comment) comment).getText().equals(_text)) && (((Comment) comment)
+ .getTimeStamp().equals(getTimeStamp())));
+ }
+}
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Content.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Content.java
new file mode 100644
index 000000000..0d9681195
--- /dev/null
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Content.java
@@ -0,0 +1,61 @@
+package com.mysema.query.grammar.hql.domain2;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * To set and get Content of html-pages with admin-gui.
+ *
+ */
+@Entity
+public class Content {
+
+ @Id
+ private String _title;
+
+ @Column(length = 100000)
+ private String _content;
+
+ public Content() {
+ //
+ }
+
+ /**
+ * @param title
+ * @param content
+ */
+ public Content(String title, String content) {
+ _title = title;
+ _content = content;
+ }
+
+ /**
+ * @return
+ */
+ public String getContent() {
+ return _content;
+ }
+
+ /**
+ * @param content
+ */
+ public void setContent(String content) {
+ _content = content;
+ }
+
+ /**
+ * @return
+ */
+ public String getTitle() {
+ return _title;
+ }
+
+ /**
+ * @param title
+ */
+ public void setTitle(String title) {
+ _title = title;
+ }
+
+}
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Country.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Country.java
new file mode 100644
index 000000000..642a22111
--- /dev/null
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Country.java
@@ -0,0 +1,47 @@
+/**
+ *
+ */
+package com.mysema.query.grammar.hql.domain2;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * A Thing can belong to multiple Countries. The Countries specify where a Thing
+ * comes from, whereas the {@link Location} specifies, where the Thing currently
+ * is located.
+ */
+@Entity
+public class Country {
+
+ @Id
+ private String _name;
+
+ public Country() {
+ }
+
+ /**
+ * @param name
+ * Name of the country.
+ */
+ public Country(String name) {
+ _name = name;
+ }
+
+ /**
+ * @return Name of the country.
+ */
+ public String getName() {
+ return _name;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object country) {
+ return ((Country) country).getName().equals(_name);
+ }
+}
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Exhibition.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Exhibition.java
new file mode 100644
index 000000000..1c71e4598
--- /dev/null
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Exhibition.java
@@ -0,0 +1,141 @@
+package com.mysema.query.grammar.hql.domain2;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.ManyToMany;
+import javax.persistence.OneToOne;
+
+@Entity
+public class Exhibition extends FeaturedItem {
+
+ @Column(unique = true)
+ private String _name;
+
+ @OneToOne
+ private User _user;
+
+ @ManyToMany
+ private List _things;
+
+ private String _location;
+
+ private String _host;
+
+ private Date _startDate;
+
+ private Date _endDate;
+
+ public Exhibition() {
+ }
+
+ /**
+ * @param name
+ * The name of the Exhibition.
+ * @param user
+ * The User responsible for the Exhibition.
+ */
+ public Exhibition(String name, User user) {
+ _name = name;
+ _user = user;
+ }
+
+ /**
+ * @return The name of the Exhibition.
+ */
+ public String getName() {
+ return _name;
+ }
+
+ /**
+ * @return The User responsible for the Exhibition.
+ */
+ public User getUser() {
+ return _user;
+ }
+
+ /**
+ * @param thing
+ * The Thing to add to the Exhibition.
+ */
+ public void addThing(Thing thing) {
+ if (_things == null)
+ _things = new ArrayList();
+ _things.add(thing);
+ }
+
+ /**
+ * @return All Things of the Exhibition.
+ */
+ public List getThings() {
+ return _things;
+ }
+
+ /**
+ * @param location
+ * The location of the Exhibition.
+ */
+ public void setLocation(String location) {
+ _location = location;
+ }
+
+ /**
+ * @return The location of the Exhibition.
+ */
+ public String getLocation() {
+ return _location;
+ }
+
+ /**
+ * @param location
+ * The host of the Exhibition.
+ */
+ public void setHost(String host) {
+ _host = host;
+ }
+
+ /**
+ * @return The host of the Exhibition.
+ */
+ public String getHost() {
+ return _host;
+ }
+
+ /**
+ * @param startDate
+ * Date when the Exhibition begins.
+ */
+ public void setStartDate(Date startDate) {
+ _startDate = startDate;
+ }
+
+ /**
+ * @return Date when the Exhibition begins.
+ */
+ public Date getStartDate() {
+ return _startDate;
+ }
+
+ /**
+ * @param endDate
+ * Date when the Exhibition ends.
+ */
+ public void setEndDate(Date endDate) {
+ _endDate = endDate;
+ }
+
+ /**
+ * @return Date when the Exhibition ends.
+ */
+ public Date getEndDate() {
+ return _endDate;
+ }
+
+ @Override
+ public boolean equals(Object exhibition){
+ return ((Exhibition)exhibition).getName().equals(_name);
+ }
+}
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/FeaturedItem.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/FeaturedItem.java
new file mode 100644
index 000000000..4d22892f3
--- /dev/null
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/FeaturedItem.java
@@ -0,0 +1,101 @@
+package com.mysema.query.grammar.hql.domain2;
+
+import javax.persistence.MappedSuperclass;
+
+/**
+ * An item can be featured. If an item is featured, it has a weight and a
+ * featuredTimeStamp. (see thinglink-2.0 datamodel)
+ *
+ */
+@MappedSuperclass
+public class FeaturedItem extends MetaDataContainer {
+
+ private Boolean _isFeatured;
+
+ private Long _featuredTimeStamp;
+
+ private Integer _weight;
+
+ /**
+ * Calls super() to create timeStamp. Initially isFeatured is set false.
+ * featuredTimeStamp and weight is initialized 0.
+ */
+ public FeaturedItem() {
+ super();
+ _isFeatured = new Boolean(false);
+ _featuredTimeStamp = new Long(-1);
+ _weight = new Integer(0);
+ }
+
+ /**
+ * @return True if the item is featured, false otherwise.
+ */
+ public Boolean isFeatured() {
+ return _isFeatured;
+ }
+
+ /**
+ * @return The featuredTimeStamp is equivalent to the time, when the Item
+ * has been featured.
+ */
+ public Long getFeaturedTimeStamp() {
+ return _featuredTimeStamp;
+ }
+
+ /**
+ * @return The weight of the featuredItem. If the item is not featured,
+ * weight is -1.
+ */
+ public Integer getWeight() {
+ return _weight;
+ }
+
+ /**
+ * @param weight
+ * If the item is featured, the weight is set. Otherwise the
+ * weight remains -1.
+ */
+ public void setWeight(int weight) {
+ if (_isFeatured.booleanValue()) {
+ _weight = Integer.valueOf(weight);
+ }
+ }
+
+ /**
+ * Sets isFeatured=true and creates a featuredTimeStamp and adds the given
+ * weight to the current weight.
+ *
+ * @param weight
+ * The weight to add to the featuredItem.
+ */
+ public void setFeatured(int weight) {
+ _isFeatured = Boolean.valueOf(true);
+ _featuredTimeStamp = Long.valueOf(System.currentTimeMillis());
+ int currentWeight;
+ if (_weight != null) {
+ currentWeight = _weight.intValue();
+ } else {
+ currentWeight = 0;
+ }
+ final int newWeight = currentWeight + weight;
+ _weight = Integer.valueOf(newWeight);
+ }
+
+ /**
+ * Sets isFeatured=false, and featuredTimeStamp and weight -1.
+ */
+ public void unfeature() {
+ _isFeatured = Boolean.valueOf(false);
+ _featuredTimeStamp = Long.valueOf(-1);
+ _weight = Integer.valueOf(0);
+ }
+
+ public void unfeature(int weight) {
+ _weight = _weight - weight;
+ if (_weight <= 0) {
+ _isFeatured = Boolean.valueOf(false);
+ _featuredTimeStamp = Long.valueOf(-1);
+ _weight = Integer.valueOf(0);
+ }
+ }
+}
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/GroupOfInterest.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/GroupOfInterest.java
new file mode 100644
index 000000000..ea79c334d
--- /dev/null
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/GroupOfInterest.java
@@ -0,0 +1,106 @@
+package com.mysema.query.grammar.hql.domain2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+@Entity
+public class GroupOfInterest {
+
+ @Id
+ private String _name;
+
+ @OneToMany
+ private List _users;
+
+ @OneToMany
+ private List _things;
+
+ private GroupOfInterestPrivacy _privacyLevel;
+
+ public enum GroupOfInterestPrivacy {
+ PRIVATE, PUBLIC;
+ }
+
+ public GroupOfInterest() {
+ }
+
+ /**
+ * @param name
+ * The name of the GroupOfInterest.
+ */
+ public GroupOfInterest(String name) {
+ _name = name;
+ }
+
+ /**
+ * @param user
+ * The User to add to the GroupOfInterest.
+ */
+ public void addUser(User user) {
+ if (_users == null) {
+ _users = new ArrayList();
+ }
+ _users.add(user);
+ }
+
+ /**
+ * @param thing
+ * The Thing to add to the GroupOfInterest.
+ */
+ public void addThing(Thing thing) {
+ if (_things == null) {
+ _things = new ArrayList();
+ }
+ _things.add(thing);
+ }
+
+ /**
+ * @return The name of the GroupOfInterest.
+ */
+ public String getName() {
+ return _name;
+ }
+
+ /**
+ * @return The privacy level of the GroupOfInterest.
+ */
+ public GroupOfInterestPrivacy getPrivacyLevel() {
+ return _privacyLevel;
+ }
+
+ /**
+ * @param privacyLevel
+ * Privacy-level of the GroupOfInterest.
+ */
+ public void setPrivacyLevel(GroupOfInterestPrivacy privacyLevel) {
+ _privacyLevel = privacyLevel;
+ }
+
+ /**
+ * @return All Users that belong to the GroupOfInterest.
+ */
+ public List getUsers() {
+ return _users;
+ }
+
+ /**
+ * @return All Things that belong to the GroupOfInterest.
+ */
+ public List getThings() {
+ return _things;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object group) {
+ return ((GroupOfInterest) group).getName().equals(_name);
+ }
+}
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/IDisplayObject.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/IDisplayObject.java
new file mode 100644
index 000000000..4ed3e82fd
--- /dev/null
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/IDisplayObject.java
@@ -0,0 +1,10 @@
+package com.mysema.query.grammar.hql.domain2;
+
+public interface IDisplayObject {
+
+ public String getDisplayObjectType();
+
+ public enum DisplayObjectType{
+ USER, THING;
+ }
+}
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Location.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Location.java
new file mode 100644
index 000000000..7848828d9
--- /dev/null
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Location.java
@@ -0,0 +1,163 @@
+package com.mysema.query.grammar.hql.domain2;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+/**
+ * The Location specifies where a Thing is currently located, whereas a
+ * {@link Country} specifies where a Thing comes from.
+ */
+@Entity
+public class Location extends TimeStamped {
+
+ @Column(length = 500)
+ private String _country;
+
+ @Column(length = 500)
+ private String _city;
+
+ @Column(length = 500)
+ private String _zipCode;
+
+ private Double _longitude;
+
+ private Double _latitude;
+
+ @Column(length = 500)
+ private String _street;
+
+ @Column(length = 500)
+ private String _url;
+
+ public Location() {//
+ }
+
+ /**
+ * @param country
+ * @param url
+ * @param zipCode
+ */
+ public Location(String country, String url, String zipCode) {
+ super();
+ _country = country;
+ _url = url;
+ _zipCode = zipCode;
+ }
+
+ /**
+ * @param country
+ */
+ public void setCountry(String country) {
+ _country = country;
+ }
+
+ /**
+ * @return The country where the Thing is currently located.
+ */
+ public String getCountry() {
+ return _country;
+ }
+
+ /**
+ * @param city
+ */
+ public void setCity(String city) {
+ _city = city;
+ }
+
+ /**
+ * @return The city where the Thing is currently located.
+ */
+ public String getCity() {
+ return _city;
+ }
+
+ /**
+ * @param zipCode
+ */
+ public void setZipCode(String zipCode) {
+ _zipCode = zipCode;
+ }
+
+ /**
+ * @return The zip code where the Thing is currently located.
+ */
+ public String getZipCode() {
+ return _zipCode;
+ }
+
+ /**
+ * @param longitude
+ */
+ public void setLongitude(Double longitude) {
+ _longitude = longitude;
+ }
+
+ /**
+ * @return
+ */
+ public Double getLongitude() {
+ return _longitude;
+ }
+
+ /**
+ * @param latitude
+ */
+ public void setLatitude(Double latitude) {
+ _latitude = latitude;
+ }
+
+ /**
+ * @param latitude
+ * @return
+ */
+ public Double getLatitude(Double latitude) {
+ return _latitude;
+ }
+
+ /**
+ * @param street
+ */
+ public void setStreet(String street) {
+ _street = street;
+ }
+
+ /**
+ * @return
+ */
+ public String getStreet() {
+ return _street;
+ }
+
+ /**
+ * @param url
+ * This could be a URL like
+ * http://beta.plazes.com/plaze/f93d8d1a909b6f80341e5b4f9178b218
+ */
+ public void setUrl(String url) {
+ _url = url;
+ }
+
+ /**
+ * @return A URL like
+ * http://beta.plazes.com/plaze/f93d8d1a909b6f80341e5b4f9178b218 if
+ * previously set.
+ */
+ public String getUrl() {
+ return _url;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object location) {
+ if (location == null)
+ return false;
+
+ return (((Location) location).getUrl().equals(_url) && ((Location) location).getZipCode().equals(_zipCode) && ((Location) location)
+ .getCountry().equals(_country));
+ }
+}
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Maker.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Maker.java
new file mode 100644
index 000000000..fa93b0954
--- /dev/null
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Maker.java
@@ -0,0 +1,48 @@
+/**
+ *
+ */
+package com.mysema.query.grammar.hql.domain2;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+/**
+ * A Thing has one or more Makers. A Maker can be featured. (see thinglink-2.0
+ * datamodel)
+ *
+ *
+ */
+@Entity
+public class Maker extends FeaturedItem {
+
+ @Column(unique = true)
+ private String _name;
+
+ public Maker() {
+ }
+
+ /**
+ * Calls super() to create timeStamp.
+ */
+ public Maker(String name) {
+ super();
+ _name = name;
+ }
+
+ /**
+ * @return Name of the Maker.
+ */
+ public String getName() {
+ return _name;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object maker) {
+ return ((Maker) maker).getName().equals(_name);
+ }
+}
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/MetaDataContainer.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/MetaDataContainer.java
new file mode 100644
index 000000000..a0d418692
--- /dev/null
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/MetaDataContainer.java
@@ -0,0 +1,52 @@
+package com.mysema.query.grammar.hql.domain2;
+
+import java.util.HashMap;
+
+import javax.persistence.MappedSuperclass;
+
+/**
+ * Objects can have metadata as key/value pairs. Internally those pairs are
+ * stored in a HashMap. (see thinglink-2.0 datamodel)
+ *
+ *
+ */
+@MappedSuperclass
+public class MetaDataContainer extends TimeStamped {
+
+ private HashMap _metaDataEntries;
+
+ /**
+ * Calls super() to create timeStamp.
+ */
+ public MetaDataContainer() {
+ super();
+ }
+
+ /**
+ * Add a metadata entry to this container.
+ *
+ * @param key
+ * Metadata key.
+ * @param value
+ * Metadata value.
+ */
+ public void addMetaDataEntry(String key, String value) {
+ if (_metaDataEntries == null)
+ _metaDataEntries = new HashMap(10);
+ _metaDataEntries.put(key, value);
+ }
+
+ /**
+ * Retrieve a metadata entry by key.
+ *
+ * @param key
+ * The key of the metadata entry to retrieve.
+ * @return The value of the metadata entry.
+ */
+ public String getMetaDataEntry(String key) {
+ if (_metaDataEntries != null)
+ return _metaDataEntries.get(key);
+ return null;
+ }
+
+}
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Tag.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Tag.java
new file mode 100644
index 000000000..09b395323
--- /dev/null
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Tag.java
@@ -0,0 +1,44 @@
+package com.mysema.query.grammar.hql.domain2;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * A Thing can have multiple Tags.
+ *
+ *
+ */
+@Entity
+public class Tag {
+
+ @Id
+ private String _keyword;
+
+ public Tag() {
+ }
+
+ /**
+ * @param keyword
+ * Keyword of the Tag.
+ */
+ public Tag(String keyword) {
+ _keyword = keyword;
+ }
+
+ /**
+ * @return Keyword of the Tag.
+ */
+ public String getKeyword() {
+ return _keyword;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object tag) {
+ return ((Tag) tag).getKeyword().equals(_keyword);
+ }
+}
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Thing.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Thing.java
new file mode 100644
index 000000000..0eda2829f
--- /dev/null
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Thing.java
@@ -0,0 +1,494 @@
+/**
+ *
+ */
+package com.mysema.query.grammar.hql.domain2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.FieldBridge;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.Indexed;
+
+/**
+ * A thinglink Thing is represented. This is the core of the data model. (see
+ * thinglink-2.0 datamodel)
+ *
+ */
+@Entity
+@Indexed
+public class Thing extends FeaturedItem implements IDisplayObject {
+
+ @Column(unique = true)
+ private String _code;
+
+ @CollectionOfElements
+ private List _imageFileNames = new ArrayList();
+
+ @CollectionOfElements
+ private List _soundFileNames = new ArrayList();
+
+ @OneToMany(cascade = { CascadeType.ALL })
+ private List _comments = new ArrayList();
+
+ @ManyToMany(cascade = { CascadeType.ALL })
+ private List _makers = new ArrayList();
+
+ @ManyToMany(cascade = { CascadeType.ALL })
+// @Field(index = Index.TOKENIZED)
+// @FieldBridge(impl = TagsListBridge.class)
+ private List _tags = new ArrayList();
+
+ @ManyToMany(cascade = { CascadeType.ALL })
+// @Field(index = Index.TOKENIZED)
+// @FieldBridge(impl = CountriesListBridge.class)
+ private List _countries = new ArrayList();
+
+ @ManyToMany(cascade = { CascadeType.ALL })
+ private List _years = new ArrayList();
+
+ @ManyToOne
+ private User _linker;
+
+ @ManyToMany(cascade = { CascadeType.ALL })
+ private List _locations = new ArrayList();
+
+ @ManyToOne(cascade = { CascadeType.ALL })
+// @Field(index = Index.TOKENIZED)
+// @FieldBridge(impl = LocationBridge.class)
+ private Location _currentLocation;
+
+ @Override
+ @DocumentId
+ public Long getId() {
+ return _id;
+ }
+
+ private ThingPrivacy _privacyLevel;
+
+ @Field(index = Index.TOKENIZED)
+ private String _name;
+
+ @Column(length = 500)
+ private String _password;
+
+ private Boolean _isHidden;
+
+ @Column(length = 40000)
+ @Field(index = Index.TOKENIZED)
+ private String _description;
+
+ private Integer _viewCount;
+
+ private Boolean _isVersion1;
+
+ @Column(length = 500)
+ private String _imageFileName;
+
+ private Integer _createYear;
+
+ private Integer _createMonth;
+
+ private Integer _createDay;
+
+ public enum ThingPrivacy {
+ PRIVATE, FRIENDS, PUBLIC;
+ }
+
+ public Thing() {//
+ }
+
+ /**
+ * Initially the Thing is not hidden.
+ *
+ * @param code
+ * The unique code of the Thing. Something like "ABC123".
+ */
+ public Thing(String code) {
+ _code = code;
+ _isHidden = new Boolean(false);
+ _isVersion1 = new Boolean(false);
+ }
+
+ /**
+ * @param code
+ * The unique code of the Thing.
+ */
+ public void setCode(String code) {
+ _code = code;
+ }
+
+ /**
+ * @return The unique code of the Thing.
+ */
+ public String getCode() {
+ return _code;
+ }
+
+ /**
+ * Set true if this Thing has been created with thinglink-1.0
+ *
+ * @param version1
+ */
+ public void setVersion1(boolean version1) {
+ _isVersion1 = new Boolean(version1);
+ }
+
+ /**
+ * @return True if this Thing has been created with thinglink-1.0
+ */
+ public Boolean isVersion1() {
+ return _isVersion1;
+ }
+
+ /**
+ * @param linker
+ * The User who created the Thing.
+ */
+ public void setLinker(User linker) {
+ _linker = linker;
+ }
+
+ /**
+ * @return The User who created the Thing.
+ */
+ public User getLinker() {
+ return _linker;
+ }
+
+ /**
+ * Should be called each time the Thing is viewed.
+ */
+ public void view() {
+ if (_viewCount == null)
+ _viewCount = new Integer(0);
+ _viewCount = Integer.valueOf(_viewCount.intValue() + 1);
+ }
+
+ public void setViewCount(int count) {
+ _viewCount = new Integer(count);
+ }
+
+ /**
+ * @return Viewcount for the Thing.
+ */
+ public Integer getViewCount() {
+ return _viewCount;
+ }
+
+ /**
+ * @param comment
+ * The Comment to add to the Thing.
+ */
+ public void addComment(Comment comment) {
+ _comments.add(comment);
+ }
+
+ /**
+ * @return All Comments that belong to this Thing.
+ */
+ public List getComments() {
+ return _comments;
+ }
+
+ /**
+ * @param imageFileName
+ */
+ public void addImageFileName(String imageFileName) {
+ if (_imageFileNames == null)
+ _imageFileNames = new ArrayList();
+ _imageFileNames.add(imageFileName);
+ }
+
+ public void addSoundFileName(String soundFileName) {
+ if (_soundFileNames == null)
+ _soundFileNames = new ArrayList();
+ _soundFileNames.add(soundFileName);
+ }
+
+ /**
+ * @return
+ */
+ public List getImageFileNames() {
+ return _imageFileNames;
+ }
+
+ public List getSoundFileNames() {
+ return _soundFileNames;
+ }
+
+ /**
+ * Adds a Location to the Thing. The last Location added represents the
+ * current Location of the Thing.
+ *
+ * @param location
+ * The current Location of the Thing.
+ */
+ public void addLocation(Location location) {
+ _locations.add(location);
+ _currentLocation = location;
+ }
+
+ /**
+ * @return All Locations where the Thing has been located during the past.
+ */
+ public List getLocations() {
+ return _locations;
+ }
+
+ /**
+ * @return The Location where the Thing is currently located.
+ */
+ public Location getCurrentLocation() {
+ // return _locations.get(_locations.size()-1);
+ return _currentLocation;
+ }
+
+ /**
+ * @param name
+ * Name of the Maker of this Thing.
+ */
+ public void addMaker(Maker maker) {
+ if (_makers == null)
+ _makers = new ArrayList();
+ if (_makers.contains(maker))
+ _makers.remove(maker);
+ _makers.add(0, maker);
+ }
+
+ /**
+ * @return All Makers of this Thing.
+ */
+ public List getMakers() {
+ return _makers;
+ }
+
+ /**
+ * @param keyword
+ * Keyword of the Tag.
+ */
+ public void addTag(Tag tag) {
+ if (_tags == null)
+ _tags = new ArrayList();
+ if (!_tags.contains(tag))
+ _tags.add(tag);
+ }
+
+ /**
+ * @return All Tags of this Thing.
+ */
+ public List getTags() {
+ return _tags;
+ }
+
+ /**
+ * @param name
+ * Name of the Country.
+ */
+ public void addCountry(Country country) {
+ if (_countries == null)
+ _countries = new ArrayList();
+ if (_countries.contains(country))
+ _countries.remove(country);
+ _countries.add(0, country);
+ }
+
+ /**
+ * @return All Countries this Thing belongs to.
+ */
+ public List getCountries() {
+ return _countries;
+ }
+
+ /**
+ * @param year
+ */
+ public void addYear(Year year) {
+ if (_years == null)
+ _years = new ArrayList();
+ if (!_years.contains(year))
+ _years.add(year);
+ }
+
+ /**
+ * @return
+ */
+ public List getYears() {
+ return _years;
+ }
+
+ /**
+ * @param privacyLevel
+ * The privacy level of the Thing.
+ */
+ public void setPrivacyLevel(ThingPrivacy privacy) {
+ _privacyLevel = privacy;
+ }
+
+ /**
+ * @return Privacy level of the Thing.
+ */
+ public ThingPrivacy getPrivacyLevel() {
+ return _privacyLevel;
+ }
+
+ /**
+ * @param name
+ * Name of the Thing.
+ */
+ public void setName(String name) {
+ _name = name;
+ }
+
+ /**
+ * @return Name of the Thing.
+ */
+ public String getName() {
+ if (_name == null)
+ return "unknown name";
+ return _name;
+ }
+
+ /**
+ * Encrypts the given password.
+ *
+ * @param password
+ * Things password.
+ */
+ public void setPassword(String password) {
+// _password = PasswordUtil.encryptPassword(password);
+ _password = password;
+ }
+
+ /**
+ * Tests whether the given password is equal to Things password.
+ *
+ * @param password
+ * The non-encrypted password to test.
+ * @return True if passwords are equal.
+ */
+ public boolean equalsEncryptedPassword(String password) {
+// return _password.equals(PasswordUtil.encryptPassword(password));
+ return _password.equals(password);
+ }
+
+ /**
+ * @param hidden
+ */
+ public void setHidden(boolean hidden) {
+ _isHidden = Boolean.valueOf(hidden);
+ }
+
+ /**
+ * @return
+ */
+ public Boolean isHidden() {
+ return _isHidden;
+ }
+
+ /**
+ * @return The description of the Thing.
+ */
+ public String getDescription() {
+ if (_description == null)
+ return "";
+ return _description;
+ }
+
+ /**
+ * @param description
+ * The description of the Thing.
+ */
+ public void setDescription(String description) {
+ _description = description;
+ }
+
+ /**
+ * @param imageFileName
+ */
+ public void setImageFileName(String imageFileName) {
+ _imageFileName = imageFileName;
+ }
+
+ /**
+ * @return
+ */
+ public String getImageFileName() {
+ return _imageFileName;
+ }
+
+ public Integer getCreateDay() {
+ return _createDay;
+ }
+
+ public void setCreateDay(Integer createDay) {
+ _createDay = createDay;
+ }
+
+ public Integer getCreateMonth() {
+ return _createMonth;
+ }
+
+ public void setCreateMonth(Integer createMonth) {
+ _createMonth = createMonth;
+ }
+
+ public Integer getCreateYear() {
+ return _createYear;
+ }
+
+ public void setCreateYear(Integer createYear) {
+ _createYear = createYear;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object thing) {
+ return ((Thing) thing).getCode().equals(_code);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return _code;
+ }
+
+ public void removeTags() {
+ _tags = new ArrayList();
+ }
+
+ public void deleteImages(int[] toDeleteImageIndices) {
+ for (int i = toDeleteImageIndices.length - 1; i > -1; i--) {
+ _imageFileNames.remove(toDeleteImageIndices[i]);
+ }
+ }
+
+ public void deleteSounds(int[] toDeleteSoundIndices) {
+ for (int i = toDeleteSoundIndices.length - 1; i > -1; i--) {
+ _soundFileNames.remove(toDeleteSoundIndices[i]);
+ }
+ }
+
+ public String getDisplayObjectType() {
+ return DisplayObjectType.THING.name();
+ }
+
+}
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/TimeStamped.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/TimeStamped.java
new file mode 100644
index 000000000..5c2d6f392
--- /dev/null
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/TimeStamped.java
@@ -0,0 +1,34 @@
+package com.mysema.query.grammar.hql.domain2;
+
+import javax.persistence.MappedSuperclass;
+
+/**
+ * Each object has a timeStamp that is equivalent to the time the object has
+ * been created. (see thinglink-2.0 datamodel)
+ *
+ */
+@MappedSuperclass
+public class TimeStamped extends BaseEntity {
+
+ private Long _timeStamp;
+
+ /**
+ * When the constructor is called, the timeStamp is created.
+ */
+ public TimeStamped() {
+ _timeStamp = new Long(System.currentTimeMillis());
+ }
+
+ /**
+ * @return timeStamp that is equivalent to the time the object has been
+ * created.
+ */
+ public Long getTimeStamp() {
+ return _timeStamp;
+ }
+
+ public void setTimeStamp(long timeStamp) {
+ _timeStamp = new Long(timeStamp);
+ }
+
+}
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/User.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/User.java
new file mode 100644
index 000000000..fef54eb59
--- /dev/null
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/User.java
@@ -0,0 +1,504 @@
+package com.mysema.query.grammar.hql.domain2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.ManyToMany;
+
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.Indexed;
+
+/**
+ * A thinglink User is represented. (see thinglink-2.0 datamodel)
+ *
+ */
+@Entity
+@Indexed
+public class User extends FeaturedItem implements IDisplayObject {
+
+ @Column(unique = true)
+ @Field(index = Index.TOKENIZED)
+ private String _name;
+
+ @Field(index = Index.TOKENIZED)
+ private String _fullName;
+
+ private UserType _type;
+
+ @Column(length = 500)
+ private String _password;
+
+ private String _bio;
+
+ @Column(length = 500)
+ @Field(index = Index.TOKENIZED)
+ private String _homepage;
+
+ @Column(length = 500)
+ private String _email;
+
+ @Column(length = 500)
+ private String _phone;
+
+ @Column(length = 500)
+ private String _flickrUsername;
+
+ @Column(length = 500)
+ private String _flickrId;
+
+ @Column(length = 500)
+ private String _facebookId;
+
+ @Column(length = 500)
+ private String _description;
+
+ @Column(length = 500)
+ private String _imageFileName;
+
+ private Integer _yearOfBirthday;
+
+ private Integer _monthOfBirthday;
+
+ private Integer _dayOfBirthday;
+
+ @Column(length = 500)
+ @Field(index = Index.TOKENIZED)
+ private String _originalLocationCountry;
+
+ private Boolean _doChat;
+
+ @Column(length = 500)
+ @Field(index = Index.TOKENIZED)
+ private String _chatName;
+
+ private ChatType _chatType;
+
+ @Column(length = 500)
+ @Field(index = Index.TOKENIZED)
+ private String _location;
+
+ @ManyToMany
+ private List _friends = new ArrayList();
+
+ @CollectionOfElements
+ private List _urls = new ArrayList();
+
+ @Override
+ @DocumentId
+ public Long getId() {
+ return _id;
+ }
+
+ public enum UserType {
+ ARTIST, COLLECTOR, CRAFTER, CURATOR, DESIGNER, DEVELOPER, ENTREPRENEUR, HOBBYIST, MAGAZINE, MISCELLANEOUS, MUSEUM, RETAILER, STUDENT, TRENDSPOTTER, OTHER, BUSINESS, MANUFACTURER, SCHOOL, TEACHER;
+ }
+
+ public enum ChatType {
+ NONE, AIM, GOOGLE, ICQ, MSN, YAHOO;
+ }
+
+ private boolean _admin = false;
+
+ private String _deactivationId;
+
+ public User() {//
+ }
+
+ /**
+ * @param name
+ */
+ public User(String name) {
+ super();
+ _name = name;
+ }
+
+ /**
+ * Calls super() to create timeStamp.
+ *
+ * @param name
+ * Users name.
+ * @param eMail
+ * Users E-Mail.
+ */
+ public User(String name, String eMail) {
+ super();
+ _name = name;
+ _email = eMail;
+ }
+
+ /**
+ * Where is the User currently located?
+ *
+ * @param location
+ */
+ public void setLocation(String location) {
+ _location = location;
+ }
+
+ /**
+ * @return Where is the User currently located?
+ */
+ public String getLocation() {
+ return _location;
+ }
+
+ /**
+ * @param chatType
+ */
+ public void setChatType(ChatType chatType) {
+ _chatType = chatType;
+ }
+
+ /**
+ * @return
+ */
+ public ChatType getChatType() {
+ return _chatType;
+ }
+
+ /**
+ * @param chatName
+ * @return
+ */
+ public void setChatName(String chatName) {
+ _chatName = chatName;
+ }
+
+ /**
+ * @return
+ */
+ public String getChatName() {
+ return _chatName;
+ }
+
+ /**
+ * @param doChat
+ */
+ public void doChat(Boolean doChat) {
+ _doChat = doChat;
+ }
+
+ /**
+ * @return
+ */
+ public Boolean doChat() {
+ return _doChat;
+ }
+
+ /**
+ * Where is the User born?
+ *
+ * @param country
+ */
+ public void setOriginalLocationCountry(String country) {
+ _originalLocationCountry = country;
+ }
+
+ /**
+ * @return Where is the User born?
+ */
+ public String getOriginalLocationCountry() {
+ return _originalLocationCountry;
+ }
+
+ /**
+ * @param fullName
+ */
+ public void setFullName(String fullName) {
+ _fullName = fullName;
+ }
+
+ /**
+ * @return
+ */
+ public String getFullName() {
+ return _fullName;
+ }
+
+ /**
+ * @param year
+ * @param month
+ * @param day
+ */
+ public void setBirthday(Integer year, Integer month, Integer day) {
+ _yearOfBirthday = year;
+ _monthOfBirthday = month;
+ _dayOfBirthday = day;
+ }
+
+ /**
+ * @return
+ */
+ public Integer getYearOfBirthday() {
+ return _yearOfBirthday;
+ }
+
+ /**
+ * @return
+ */
+ public Integer getMonthOfBirthday() {
+ return _monthOfBirthday;
+ }
+
+ /**
+ * @return
+ */
+ public Integer getDayOfBirthday() {
+ return _dayOfBirthday;
+ }
+
+ /**
+ * Encrypts the given password.
+ *
+ * @param password
+ * Users password.
+ */
+ public void setPassword(String password) {
+ // _password = PasswordUtil.encryptPassword(password);
+ _password = password;
+ }
+
+ /**
+ * @param friend
+ * Another user can be a friend.
+ */
+ public void addFriend(User friend) {
+ _friends.add(friend);
+ }
+
+ public boolean removeFriend(User friend) {
+ boolean success = _friends.remove(friend);
+ return success;
+ }
+
+ /**
+ * @return All users that are friends of this user. Null if there are no
+ * friends.
+ */
+ public List getFriends() {
+ return _friends;
+ }
+
+ /**
+ * @param url
+ */
+ public void addUrl(String url) {
+ _urls.add(url);
+ }
+
+ /**
+ * @return
+ */
+ public List getUrls() {
+ return _urls;
+ }
+
+ /**
+ * @param name
+ * Name of the user.
+ */
+ public void setName(String name) {
+ _name = name;
+ }
+
+ /**
+ * @param type
+ */
+ public void setType(UserType type) {
+ _type = type;
+ }
+
+ /**
+ * @param email
+ * E-Mail address of the user.
+ */
+ public void setEmail(String email) {
+ _email = email;
+ }
+
+ public void setPhone(String phone) {
+ _phone = phone;
+ }
+
+ /**
+ * @param bio
+ * Users bio.
+ */
+ public void setBio(String bio) {
+ _bio = bio;
+ }
+
+ /**
+ * @param homepage
+ * Users homepage.
+ */
+ public void setHomepage(String homepage) {
+ _homepage = homepage;
+ }
+
+ /**
+ * @param flickrUsername
+ * Users flickr username.
+ */
+ public void setFlickrUsername(String flickrUsername) {
+ _flickrUsername = flickrUsername;
+ }
+
+ /**
+ * @return Users E-Mail.
+ */
+ public String getEmail() {
+ return _email;
+ }
+
+ public String getPhone() {
+ return _phone;
+ }
+
+ /**
+ * @return Users bio.
+ */
+ public String getBio() {
+ return _bio;
+ }
+
+ /**
+ * @return Users homepage.
+ */
+ public String getHomepage() {
+ return _homepage;
+ }
+
+ /**
+ * @return Users name.
+ */
+ public String getName() {
+ return _name;
+ }
+
+ /**
+ * @return Users type.
+ */
+ public UserType getType() {
+ return _type;
+ }
+
+ /**
+ * @return Users flickr username.
+ */
+ public String getFlickrUsername() {
+ return _flickrUsername;
+ }
+
+ /**
+ * @param imageFileName
+ */
+ public void setImageFileName(String imageFileName) {
+ _imageFileName = imageFileName;
+ }
+
+ /**
+ * @return
+ */
+ public String getImageFileName() {
+ return _imageFileName;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object user) {
+ return (((User) user).getName().equals(_name));
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return _name + " " + _email;
+ }
+
+// public GrantedAuthority[] getAuthorities() {
+// return new GrantedAuthority[] { new GrantedAuthorityImpl("ROLE_USER") };
+// }
+
+ public String getPassword() {
+ return _password;
+ }
+
+ public String getUsername() {
+ return _name;
+ }
+
+ public boolean isAccountNonExpired() {
+ return true;
+ }
+
+ public boolean isAccountNonLocked() {
+ return true;
+ }
+
+ public boolean isCredentialsNonExpired() {
+ return true;
+ }
+
+ public boolean isEnabled() {
+ return true;
+ }
+
+ public boolean isAdmin() {
+ return _admin;
+ }
+
+ public void setAdmin(boolean admin) {
+ _admin = admin;
+ }
+
+ public void setDeactivationId(String activationId) {
+ _deactivationId = activationId;
+ }
+
+ public String getDeactivationId() {
+ return _deactivationId;
+ }
+
+ public String getFlickrId() {
+ return _flickrId;
+ }
+
+ public void setFlickrId(String id) {
+ _flickrId = id;
+ }
+
+ public String getFacebookId() {
+ return _facebookId;
+ }
+
+ public void setFacebookId(String facebookId) {
+ _facebookId = facebookId;
+ }
+
+ public String getDescription() {
+ return _description;
+ }
+
+ public void setDescription(String description) {
+ _description = description;
+ }
+
+ public String getDisplayObjectType() {
+ return DisplayObjectType.USER.name();
+ }
+
+}
diff --git a/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Year.java b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Year.java
new file mode 100644
index 000000000..9d54f4a68
--- /dev/null
+++ b/querydsl-hibernate/src/test/java/com/mysema/query/grammar/hql/domain2/Year.java
@@ -0,0 +1,46 @@
+/**
+ *
+ */
+package com.mysema.query.grammar.hql.domain2;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ *
+ *
+ */
+@Entity
+public class Year {
+
+ @Id
+ private Integer _year;
+
+ public Year() {
+ }
+
+ /**
+ * @param year
+ */
+ public Year(int year) {
+ _year = new Integer(year);
+ }
+
+ /**
+ * @return
+ */
+ public Integer getYear() {
+ return _year;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object year) {
+ return ((Year) year).getYear().equals(_year);
+ }
+
+}