diff --git a/querydsl/pom.xml b/querydsl/pom.xml
index cf50144d3f..bed0cf90e5 100644
--- a/querydsl/pom.xml
+++ b/querydsl/pom.xml
@@ -14,30 +14,25 @@
UTF-8
- 1.6
- 4.10
- 3.1.0.RELEASE
- 4.3.11.Final
- 2.5.0
- 1.5.10
+ 1.8
+ 4.12
+ 4.3.1.RELEASE
+ 5.2.1.Final
+ 4.1.3
+ 1.7.21
-
- com.mysema.querydsl
- querydsl-core
- ${querydsl.version}
-
- com.mysema.querydsl
+ com.querydsl
querydsl-jpa
${querydsl.version}
- com.mysema.querydsl
+ com.querydsl
querydsl-apt
${querydsl.version}
provided
@@ -53,7 +48,7 @@
org.hibernate.javax.persistence
- hibernate-jpa-2.0-api
+ hibernate-jpa-2.1-api
1.0.0.Final
compile
@@ -69,7 +64,7 @@
commons-pool
commons-pool
- 1.5.5
+ 1.6
jar
compile
@@ -77,8 +72,8 @@
org.hsqldb
- hsqldb-j5
- 2.2.4
+ hsqldb
+ 2.3.4
@@ -118,9 +113,9 @@
- org.slf4j
- slf4j-api
- ${slf4j.version}
+ ch.qos.logback
+ logback-classic
+ 1.1.7
org.slf4j
@@ -128,17 +123,6 @@
${slf4j.version}
runtime
-
- org.slf4j
- slf4j-log4j12
- ${slf4j.version}
- runtime
-
-
- log4j
- log4j
- 1.2.16
-
@@ -157,7 +141,7 @@
org.apache.maven.plugins
maven-compiler-plugin
- 2.3.2
+ 3.5.1
${java.version}
${java.version}
@@ -168,16 +152,16 @@
com.mysema.maven
- maven-apt-plugin
- 1.0.3
+ apt-maven-plugin
+ 1.1.3
process
- target/metamodel
- com.mysema.query.apt.jpa.JPAAnnotationProcessor
+ target/generated-sources/java
+ com.querydsl.apt.jpa.JPAAnnotationProcessor
diff --git a/querydsl/src/main/java/org/baeldung/dao/PersonDaoImpl.java b/querydsl/src/main/java/org/baeldung/dao/PersonDaoImpl.java
index 555ec226ce..9acaf1dd18 100644
--- a/querydsl/src/main/java/org/baeldung/dao/PersonDaoImpl.java
+++ b/querydsl/src/main/java/org/baeldung/dao/PersonDaoImpl.java
@@ -10,8 +10,8 @@ import org.baeldung.entity.Person;
import org.baeldung.entity.QPerson;
import org.springframework.stereotype.Repository;
-import com.mysema.query.group.GroupBy;
-import com.mysema.query.jpa.impl.JPAQuery;
+import com.querydsl.core.group.GroupBy;
+import com.querydsl.jpa.impl.JPAQuery;
@Repository
public class PersonDaoImpl implements PersonDao {
@@ -27,39 +27,39 @@ public class PersonDaoImpl implements PersonDao {
@Override
public List findPersonsByFirstnameQueryDSL(final String firstname) {
- final JPAQuery query = new JPAQuery(em);
+ final JPAQuery query = new JPAQuery<>(em);
final QPerson person = QPerson.person;
- return query.from(person).where(person.firstname.eq(firstname)).list(person);
+ return query.from(person).where(person.firstname.eq(firstname)).fetch();
}
@Override
public List findPersonsByFirstnameAndSurnameQueryDSL(final String firstname, final String surname) {
- final JPAQuery query = new JPAQuery(em);
+ final JPAQuery query = new JPAQuery<>(em);
final QPerson person = QPerson.person;
- return query.from(person).where(person.firstname.eq(firstname).and(person.surname.eq(surname))).list(person);
+ return query.from(person).where(person.firstname.eq(firstname).and(person.surname.eq(surname))).fetch();
}
@Override
public List findPersonsByFirstnameInDescendingOrderQueryDSL(final String firstname) {
- final JPAQuery query = new JPAQuery(em);
+ final JPAQuery query = new JPAQuery<>(em);
final QPerson person = QPerson.person;
- return query.from(person).where(person.firstname.eq(firstname)).orderBy(person.surname.desc()).list(person);
+ return query.from(person).where(person.firstname.eq(firstname)).orderBy(person.surname.desc()).fetch();
}
@Override
public int findMaxAge() {
- final JPAQuery query = new JPAQuery(em);
+ final JPAQuery query = new JPAQuery<>(em);
final QPerson person = QPerson.person;
- return query.from(person).list(person.age.max()).get(0);
+ return query.from(person).select(person.age.max()).fetchFirst();
}
@Override
public Map findMaxAgeByName() {
- final JPAQuery query = new JPAQuery(em);
+ final JPAQuery query = new JPAQuery<>(em);
final QPerson person = QPerson.person;
return query.from(person).transform(GroupBy.groupBy(person.firstname).as(GroupBy.max(person.age)));
diff --git a/querydsl/src/main/java/org/baeldung/querydsl/intro/entities/BlogPost.java b/querydsl/src/main/java/org/baeldung/querydsl/intro/entities/BlogPost.java
new file mode 100644
index 0000000000..241bc50b03
--- /dev/null
+++ b/querydsl/src/main/java/org/baeldung/querydsl/intro/entities/BlogPost.java
@@ -0,0 +1,56 @@
+/*
+ * (c) Центр ИТ, 2016. Все права защищены.
+ */
+package org.baeldung.querydsl.intro.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+@Entity
+public class BlogPost {
+
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ private String title;
+
+ private String body;
+
+ @ManyToOne
+ private User user;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String code) {
+ this.title = code;
+ }
+
+ public String getBody() {
+ return body;
+ }
+
+ public void setBody(String body) {
+ this.body = body;
+ }
+
+ public User getUser() {
+ return user;
+ }
+
+ public void setUser(User user) {
+ this.user = user;
+ }
+}
diff --git a/querydsl/src/main/java/org/baeldung/querydsl/intro/entities/User.java b/querydsl/src/main/java/org/baeldung/querydsl/intro/entities/User.java
new file mode 100644
index 0000000000..c0681e15d1
--- /dev/null
+++ b/querydsl/src/main/java/org/baeldung/querydsl/intro/entities/User.java
@@ -0,0 +1,55 @@
+/*
+ * (c) Центр ИТ, 2016. Все права защищены.
+ */
+package org.baeldung.querydsl.intro.entities;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.*;
+
+@Entity
+public class User {
+
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ private String login;
+
+ private Boolean disabled;
+
+ @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "user")
+ private Set blogPosts = new HashSet<>(0);
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getLogin() {
+ return login;
+ }
+
+ public void setLogin(String name) {
+ this.login = name;
+ }
+
+ public Set getBlogPosts() {
+ return blogPosts;
+ }
+
+ public void setBlogPosts(Set blogPosts) {
+ this.blogPosts = blogPosts;
+ }
+
+ public Boolean getDisabled() {
+ return disabled;
+ }
+
+ public void setDisabled(Boolean disabled) {
+ this.disabled = disabled;
+ }
+}
diff --git a/querydsl/src/main/resources/META-INF/persistence.xml b/querydsl/src/main/resources/META-INF/persistence.xml
index 111d7933c3..2964382d48 100644
--- a/querydsl/src/main/resources/META-INF/persistence.xml
+++ b/querydsl/src/main/resources/META-INF/persistence.xml
@@ -16,4 +16,17 @@
+
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/querydsl/src/main/resources/log4j.xml b/querydsl/src/main/resources/logback.xml
similarity index 53%
rename from querydsl/src/main/resources/log4j.xml
rename to querydsl/src/main/resources/logback.xml
index a7f96b38a4..d0a1dc06ac 100644
--- a/querydsl/src/main/resources/log4j.xml
+++ b/querydsl/src/main/resources/logback.xml
@@ -1,12 +1,9 @@
-
-
+
-
-
-
-
-
+
+
+ %d{yyyy-MM-dd HH:mm:ss} [%t] %-5p: %c - %m%n
@@ -33,10 +30,8 @@
-
-
-
-
+
+
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/querydsl/src/test/java/org/baeldung/querydsl/intro/QueryDSLTest.java b/querydsl/src/test/java/org/baeldung/querydsl/intro/QueryDSLTest.java
new file mode 100644
index 0000000000..682fa2c245
--- /dev/null
+++ b/querydsl/src/test/java/org/baeldung/querydsl/intro/QueryDSLTest.java
@@ -0,0 +1,215 @@
+/*
+ * (c) Центр ИТ, 2016. Все права защищены.
+ */
+package org.baeldung.querydsl.intro;
+
+import java.util.List;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import org.baeldung.querydsl.intro.entities.BlogPost;
+import org.baeldung.querydsl.intro.entities.QBlogPost;
+import org.baeldung.querydsl.intro.entities.QUser;
+import org.baeldung.querydsl.intro.entities.User;
+import com.querydsl.core.Tuple;
+import com.querydsl.core.types.dsl.Expressions;
+import com.querydsl.core.types.dsl.NumberPath;
+import com.querydsl.jpa.JPAExpressions;
+import com.querydsl.jpa.impl.JPAQueryFactory;
+import org.junit.*;
+
+import static org.junit.Assert.*;
+
+public class QueryDSLTest {
+
+ private static EntityManagerFactory emf;
+
+ private EntityManager em;
+
+ private JPAQueryFactory queryFactory;
+
+ @BeforeClass
+ public static void populateDatabase() {
+ emf = Persistence.createEntityManagerFactory("org.baeldung.querydsl.intro");
+ EntityManager em = emf.createEntityManager();
+
+ em.getTransaction().begin();
+ User user1 = new User();
+ user1.setLogin("David");
+ em.persist(user1);
+
+ User user2 = new User();
+ user2.setLogin("Ash");
+ em.persist(user2);
+
+ User user3 = new User();
+ user3.setLogin("Call");
+ em.persist(user3);
+
+ User user4 = new User();
+ user4.setLogin("Bishop");
+ em.persist(user4);
+
+ BlogPost blogPost1 = new BlogPost();
+ blogPost1.setTitle("Hello World!");
+ blogPost1.setUser(user1);
+ em.persist(blogPost1);
+
+ BlogPost blogPost2 = new BlogPost();
+ blogPost2.setTitle("My Second Post");
+ blogPost2.setUser(user1);
+ em.persist(blogPost2);
+
+ BlogPost blogPost3 = new BlogPost();
+ blogPost3.setTitle("Hello World!");
+ blogPost3.setUser(user3);
+ em.persist(blogPost3);
+
+ em.getTransaction().commit();
+
+ em.close();
+
+ }
+
+ @Before
+ public void setUp() {
+ em = emf.createEntityManager();
+ em.getTransaction().begin();
+ queryFactory = new JPAQueryFactory(em);
+ }
+
+ @Test
+ public void whenFindByLogin_thenShouldReturnUser() {
+
+ QUser user = QUser.user;
+ User aUser = queryFactory.selectFrom(user)
+ .where(user.login.eq("David"))
+ .fetchOne();
+
+ assertNotNull(aUser);
+ assertEquals(aUser.getLogin(), "David");
+
+ }
+
+ @Test
+ public void whenUsingOrderBy_thenResultsShouldBeOrdered() {
+
+ QUser user = QUser.user;
+ List users = queryFactory.selectFrom(user)
+ .orderBy(user.login.asc())
+ .fetch();
+
+ assertEquals(users.size(), 4);
+ assertEquals(users.get(0).getLogin(), "Ash");
+ assertEquals(users.get(1).getLogin(), "Bishop");
+ assertEquals(users.get(2).getLogin(), "Call");
+ assertEquals(users.get(3).getLogin(), "David");
+
+ }
+
+ @Test
+ public void whenGroupingByTitle_thenReturnsTuples() {
+
+ QBlogPost blogPost = QBlogPost.blogPost;
+
+ NumberPath count = Expressions.numberPath(Long.class, "c");
+
+ List userTitleCounts = queryFactory.select(blogPost.title, blogPost.id.count().as(count))
+ .from(blogPost)
+ .groupBy(blogPost.title)
+ .orderBy(count.desc())
+ .fetch();
+
+ assertEquals("Hello World!", userTitleCounts.get(0).get(blogPost.title));
+ assertEquals(new Long(2), userTitleCounts.get(0).get(count));
+
+ assertEquals("My Second Post", userTitleCounts.get(1).get(blogPost.title));
+ assertEquals(new Long(1), userTitleCounts.get(1).get(count));
+
+ }
+
+ @Test
+ public void whenJoiningWithCondition_thenResultCountShouldMatch() {
+
+ QUser user = QUser.user;
+ QBlogPost blogPost = QBlogPost.blogPost;
+
+ List users = queryFactory.selectFrom(user)
+ .innerJoin(user.blogPosts, blogPost)
+ .on(blogPost.title.eq("Hello World!"))
+ .fetch();
+
+ assertEquals(2, users.size());
+ }
+
+ @Test
+ public void whenRefiningWithSubquery_thenResultCountShouldMatch() {
+
+ QUser user = QUser.user;
+ QBlogPost blogPost = QBlogPost.blogPost;
+
+ List users = queryFactory.selectFrom(user)
+ .where(user.id.in(
+ JPAExpressions.select(blogPost.user.id)
+ .from(blogPost)
+ .where(blogPost.title.eq("Hello World!"))))
+ .fetch();
+
+ assertEquals(2, users.size());
+ }
+
+ @Test
+ public void whenUpdating_thenTheRecordShouldChange() {
+
+ QUser user = QUser.user;
+
+ queryFactory.update(user)
+ .where(user.login.eq("Ash"))
+ .set(user.login, "Ash2")
+ .set(user.disabled, true)
+ .execute();
+
+ em.getTransaction().commit();
+
+ em.getTransaction().begin();
+
+ assertEquals(Boolean.TRUE,
+ queryFactory.select(user.disabled)
+ .from(user)
+ .where(user.login.eq("Ash2"))
+ .fetchOne());
+
+ }
+
+ @Test
+ public void whenDeleting_thenTheRecordShouldBeAbsent() {
+
+ QUser user = QUser.user;
+
+ queryFactory.delete(user)
+ .where(user.login.eq("Bishop"))
+ .execute();
+
+ em.getTransaction().commit();
+
+ em.getTransaction().begin();
+
+ assertNull(queryFactory.selectFrom(user)
+ .where(user.login.eq("Bishop"))
+ .fetchOne());
+
+ }
+
+ @After
+ public void tearDown() {
+ em.getTransaction().commit();
+ em.close();
+ }
+
+ @AfterClass
+ public static void afterClass() {
+ emf.close();
+ }
+
+}