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(); + } + +}