diff --git a/pom.xml b/pom.xml index 5b75ecbb..385cf1cf 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ 1.8 0.9.0-rc1 4.0 - 3.6.4 + 4.0.2 1.5.0 @@ -265,14 +265,14 @@ - com.mysema.querydsl + com.querydsl querydsl-apt ${querydsl.version} provided hibernate - com.mysema.querydsl + com.querydsl querydsl-jpa ${querydsl.version} diff --git a/src/main/java/com/commafeed/backend/dao/FeedCategoryDAO.java b/src/main/java/com/commafeed/backend/dao/FeedCategoryDAO.java index 3e788974..6fc78806 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedCategoryDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedCategoryDAO.java @@ -13,7 +13,7 @@ import com.commafeed.backend.model.FeedCategory; import com.commafeed.backend.model.QFeedCategory; import com.commafeed.backend.model.QUser; import com.commafeed.backend.model.User; -import com.mysema.query.types.Predicate; +import com.querydsl.core.types.Predicate; @Singleton public class FeedCategoryDAO extends GenericDAO { @@ -26,11 +26,11 @@ public class FeedCategoryDAO extends GenericDAO { } public List findAll(User user) { - return newQuery().from(category).where(category.user.eq(user)).join(category.user, QUser.user).fetch().list(category); + return query().selectFrom(category).where(category.user.eq(user)).join(category.user, QUser.user).fetchJoin().fetch(); } public FeedCategory findById(User user, Long id) { - return newQuery().from(category).where(category.user.eq(user), category.id.eq(id)).uniqueResult(category); + return query().selectFrom(category).where(category.user.eq(user), category.id.eq(id)).fetchOne(); } public FeedCategory findByName(User user, String name, FeedCategory parent) { @@ -40,7 +40,7 @@ public class FeedCategoryDAO extends GenericDAO { } else { parentPredicate = category.parent.eq(parent); } - return newQuery().from(category).where(category.user.eq(user), category.name.eq(name), parentPredicate).uniqueResult(category); + return query().selectFrom(category).where(category.user.eq(user), category.name.eq(name), parentPredicate).fetchOne(); } public List findByParent(User user, FeedCategory parent) { @@ -50,7 +50,7 @@ public class FeedCategoryDAO extends GenericDAO { } else { parentPredicate = category.parent.eq(parent); } - return newQuery().from(category).where(category.user.eq(user), parentPredicate).list(category); + return query().selectFrom(category).where(category.user.eq(user), parentPredicate).fetch(); } public List findAllChildrenCategories(User user, FeedCategory parent) { diff --git a/src/main/java/com/commafeed/backend/dao/FeedDAO.java b/src/main/java/com/commafeed/backend/dao/FeedDAO.java index e522437c..67f86cb8 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedDAO.java @@ -15,8 +15,9 @@ import com.commafeed.backend.model.QFeed; import com.commafeed.backend.model.QFeedSubscription; import com.commafeed.backend.model.QUser; import com.google.common.collect.Iterables; -import com.mysema.query.jpa.hibernate.HibernateQuery; -import com.mysema.query.jpa.hibernate.HibernateSubQuery; +import com.querydsl.jpa.JPAExpressions; +import com.querydsl.jpa.JPQLQuery; +import com.querydsl.jpa.hibernate.HibernateQuery; @Singleton public class FeedDAO extends GenericDAO { @@ -29,23 +30,23 @@ public class FeedDAO extends GenericDAO { } public List findNextUpdatable(int count, Date lastLoginThreshold) { - HibernateQuery query = newQuery().from(feed); + HibernateQuery query = query().selectFrom(feed); query.where(feed.disabledUntil.isNull().or(feed.disabledUntil.lt(new Date()))); if (lastLoginThreshold != null) { QFeedSubscription subs = QFeedSubscription.feedSubscription; QUser user = QUser.user; - HibernateSubQuery subQuery = new HibernateSubQuery().from(subs); + JPQLQuery subQuery = JPAExpressions.selectOne().from(subs); subQuery.join(subs.user, user).where(user.lastLogin.gt(lastLoginThreshold)); query.where(subQuery.exists()); } - return query.orderBy(feed.disabledUntil.asc()).limit(count).distinct().list(feed); + return query.orderBy(feed.disabledUntil.asc()).limit(count).distinct().fetch(); } public Feed findByUrl(String normalizedUrl) { - List feeds = newQuery().from(feed).where(feed.normalizedUrlHash.eq(DigestUtils.sha1Hex(normalizedUrl))).list(feed); + List feeds = query().selectFrom(feed).where(feed.normalizedUrlHash.eq(DigestUtils.sha1Hex(normalizedUrl))).fetch(); Feed feed = Iterables.getFirst(feeds, null); if (feed != null && StringUtils.equals(normalizedUrl, feed.getNormalizedUrl())) { return feed; @@ -54,12 +55,12 @@ public class FeedDAO extends GenericDAO { } public List findByTopic(String topic) { - return newQuery().from(feed).where(feed.pushTopicHash.eq(DigestUtils.sha1Hex(topic))).list(feed); + return query().selectFrom(feed).where(feed.pushTopicHash.eq(DigestUtils.sha1Hex(topic))).fetch(); } public List findWithoutSubscriptions(int max) { QFeedSubscription sub = QFeedSubscription.feedSubscription; - return newQuery().from(feed).where(new HibernateSubQuery().from(sub).where(sub.feed.eq(feed)).notExists()).limit(max).list(feed); - // return newQuery().from(feed).leftJoin(feed.subscriptions, sub).where(sub.id.isNull()).limit(max).list(feed); + return query().selectFrom(feed).where(JPAExpressions.selectOne().from(sub).where(sub.feed.eq(feed)).notExists()).limit(max) + .fetch(); } } diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryContentDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryContentDAO.java index 5056e7f5..68eeb41e 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryContentDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryContentDAO.java @@ -10,13 +10,14 @@ import org.hibernate.SessionFactory; import com.commafeed.backend.model.FeedEntryContent; import com.commafeed.backend.model.QFeedEntry; import com.commafeed.backend.model.QFeedEntryContent; -import com.google.common.collect.Iterables; -import com.mysema.query.jpa.hibernate.HibernateSubQuery; +import com.querydsl.jpa.JPAExpressions; +import com.querydsl.jpa.JPQLQuery; @Singleton public class FeedEntryContentDAO extends GenericDAO { private QFeedEntryContent content = QFeedEntryContent.feedEntryContent; + private QFeedEntry entry = QFeedEntry.feedEntry; @Inject public FeedEntryContentDAO(SessionFactory sessionFactory) { @@ -24,16 +25,14 @@ public class FeedEntryContentDAO extends GenericDAO { } public Long findExisting(String contentHash, String titleHash) { - List list = newQuery().from(content).where(content.contentHash.eq(contentHash), content.titleHash.eq(titleHash)).limit(1) - .list(content.id); - return Iterables.getFirst(list, null); + return query().select(content.id).from(content).where(content.contentHash.eq(contentHash), content.titleHash.eq(titleHash)) + .fetchFirst(); } public int deleteWithoutEntries(int max) { - QFeedEntry entry = QFeedEntry.feedEntry; - HibernateSubQuery subQuery = new HibernateSubQuery().from(entry).where(entry.content.id.eq(content.id)); - List list = newQuery().from(content).where(subQuery.notExists()).limit(max).list(content); + JPQLQuery subQuery = JPAExpressions.selectOne().from(entry).where(entry.content.id.eq(content.id)); + List list = query().selectFrom(content).where(subQuery.notExists()).limit(max).fetch(); int deleted = list.size(); delete(list); diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java index a5a13790..bbb3853f 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java @@ -6,18 +6,17 @@ import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; -import lombok.AllArgsConstructor; -import lombok.Getter; - import org.apache.commons.codec.digest.DigestUtils; import org.hibernate.SessionFactory; import com.commafeed.backend.model.Feed; import com.commafeed.backend.model.FeedEntry; import com.commafeed.backend.model.QFeedEntry; -import com.google.common.collect.Iterables; -import com.mysema.query.Tuple; -import com.mysema.query.types.expr.NumberExpression; +import com.querydsl.core.Tuple; +import com.querydsl.core.types.dsl.NumberExpression; + +import lombok.AllArgsConstructor; +import lombok.Getter; @Singleton public class FeedEntryDAO extends GenericDAO { @@ -30,24 +29,25 @@ public class FeedEntryDAO extends GenericDAO { } public Long findExisting(String guid, Feed feed) { - List list = newQuery().from(entry).where(entry.guidHash.eq(DigestUtils.sha1Hex(guid)), entry.feed.eq(feed)).limit(1) - .list(entry.id); - return Iterables.getFirst(list, null); + return query().select(entry.id).from(entry).where(entry.guidHash.eq(DigestUtils.sha1Hex(guid)), entry.feed.eq(feed)).limit(1) + .fetchOne(); } public List findFeedsExceedingCapacity(long maxCapacity, long max) { NumberExpression count = entry.id.count(); - List tuples = newQuery().from(entry).groupBy(entry.feed).having(count.gt(maxCapacity)).limit(max).list(entry.feed.id, count); + List tuples = query().select(entry.feed.id, count).from(entry).groupBy(entry.feed).having(count.gt(maxCapacity)).limit(max) + .fetch(); return tuples.stream().map(t -> new FeedCapacity(t.get(entry.feed.id), t.get(count))).collect(Collectors.toList()); } public int delete(Long feedId, long max) { - List list = newQuery().from(entry).where(entry.feed.id.eq(feedId)).limit(max).list(entry); + + List list = query().selectFrom(entry).where(entry.feed.id.eq(feedId)).limit(max).fetch(); return delete(list); } public int deleteOldEntries(Long feedId, long max) { - List list = newQuery().from(entry).where(entry.feed.id.eq(feedId)).orderBy(entry.updated.asc()).limit(max).list(entry); + List list = query().selectFrom(entry).where(entry.feed.id.eq(feedId)).orderBy(entry.updated.asc()).limit(max).fetch(); return delete(list); } diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java index 524012dd..7524b816 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java @@ -30,9 +30,9 @@ import com.commafeed.backend.model.UserSettings.ReadingOrder; import com.commafeed.frontend.model.UnreadCount; import com.google.common.collect.Iterables; import com.google.common.collect.Ordering; -import com.mysema.query.BooleanBuilder; -import com.mysema.query.Tuple; -import com.mysema.query.jpa.hibernate.HibernateQuery; +import com.querydsl.core.BooleanBuilder; +import com.querydsl.core.Tuple; +import com.querydsl.jpa.hibernate.HibernateQuery; @Singleton public class FeedEntryStatusDAO extends GenericDAO { @@ -68,7 +68,7 @@ public class FeedEntryStatusDAO extends GenericDAO { private static final Comparator STATUS_COMPARATOR_ASC = Ordering.from(STATUS_COMPARATOR_DESC).reverse(); public FeedEntryStatus getStatus(User user, FeedSubscription sub, FeedEntry entry) { - List statuses = newQuery().from(status).where(status.entry.eq(entry), status.subscription.eq(sub)).list(status); + List statuses = query().selectFrom(status).where(status.entry.eq(entry), status.subscription.eq(sub)).fetch(); FeedEntryStatus status = Iterables.getFirst(statuses, null); return handleStatus(user, status, sub, entry); } @@ -93,7 +93,7 @@ public class FeedEntryStatusDAO extends GenericDAO { } public List findStarred(User user, Date newerThan, int offset, int limit, ReadingOrder order, boolean includeContent) { - HibernateQuery query = newQuery().from(status).where(status.user.eq(user), status.starred.isTrue()); + HibernateQuery query = query().selectFrom(status).where(status.user.eq(user), status.starred.isTrue()); if (newerThan != null) { query.where(status.entryInserted.gt(newerThan)); } @@ -110,7 +110,7 @@ public class FeedEntryStatusDAO extends GenericDAO { query.setTimeout(timeout / 1000); } - List statuses = query.list(status); + List statuses = query.fetch(); for (FeedEntryStatus status : statuses) { status = handleStatus(user, status, status.getSubscription(), status.getEntry()); fetchTags(user, status); @@ -118,10 +118,10 @@ public class FeedEntryStatusDAO extends GenericDAO { return lazyLoadContent(includeContent, statuses); } - private HibernateQuery buildQuery(User user, FeedSubscription sub, boolean unreadOnly, List keywords, Date newerThan, - int offset, int limit, ReadingOrder order, Date last, String tag) { + private HibernateQuery buildQuery(User user, FeedSubscription sub, boolean unreadOnly, List keywords, + Date newerThan, int offset, int limit, ReadingOrder order, Date last, String tag) { - HibernateQuery query = newQuery().from(entry).where(entry.feed.eq(sub.getFeed())); + HibernateQuery query = query().selectFrom(entry).where(entry.feed.eq(sub.getFeed())); if (CollectionUtils.isNotEmpty(keywords)) { query.join(entry.content, content); @@ -197,8 +197,8 @@ public class FeedEntryStatusDAO extends GenericDAO { FixedSizeSortedSet set = new FixedSizeSortedSet(capacity, comparator); for (FeedSubscription sub : subs) { Date last = (order != null && set.isFull()) ? set.last().getEntryUpdated() : null; - HibernateQuery query = buildQuery(user, sub, unreadOnly, keywords, newerThan, -1, capacity, order, last, tag); - List tuples = query.list(entry.id, entry.updated, status.id); + HibernateQuery query = buildQuery(user, sub, unreadOnly, keywords, newerThan, -1, capacity, order, last, tag); + List tuples = query.select(entry.id, entry.updated, status.id).fetch(); for (Tuple tuple : tuples) { Long id = tuple.get(entry.id); Date updated = tuple.get(entry.updated); @@ -245,8 +245,8 @@ public class FeedEntryStatusDAO extends GenericDAO { public UnreadCount getUnreadCount(User user, FeedSubscription subscription) { UnreadCount uc = null; - HibernateQuery query = buildQuery(user, subscription, true, null, null, -1, -1, null, null, null); - List tuples = query.list(entry.count(), entry.updated.max()); + HibernateQuery query = buildQuery(user, subscription, true, null, null, -1, -1, null, null, null); + List tuples = query.select(entry.count(), entry.updated.max()).fetch(); for (Tuple tuple : tuples) { Long count = tuple.get(entry.count()); Date updated = tuple.get(entry.updated.max()); @@ -266,7 +266,7 @@ public class FeedEntryStatusDAO extends GenericDAO { } public List getOldStatuses(Date olderThan, int limit) { - return newQuery().from(status).where(status.entryInserted.lt(olderThan), status.starred.isFalse()).limit(limit).list(status); + return query().selectFrom(status).where(status.entryInserted.lt(olderThan), status.starred.isFalse()).limit(limit).fetch(); } } diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryTagDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryTagDAO.java index e2dc3ac9..f0ef9388 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryTagDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryTagDAO.java @@ -23,10 +23,10 @@ public class FeedEntryTagDAO extends GenericDAO { } public List findByUser(User user) { - return newQuery().from(tag).where(tag.user.eq(user)).distinct().list(tag.name); + return query().selectDistinct(tag.name).from(tag).where(tag.user.eq(user)).fetch(); } public List findByEntry(User user, FeedEntry entry) { - return newQuery().from(tag).where(tag.user.eq(user), tag.entry.eq(entry)).list(tag); + return query().selectFrom(tag).where(tag.user.eq(user), tag.entry.eq(entry)).fetch(); } } diff --git a/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java b/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java index bcda4c1e..bfdc39e0 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java @@ -16,7 +16,7 @@ import com.commafeed.backend.model.Models; import com.commafeed.backend.model.QFeedSubscription; import com.commafeed.backend.model.User; import com.google.common.collect.Iterables; -import com.mysema.query.jpa.hibernate.HibernateQuery; +import com.querydsl.jpa.hibernate.HibernateQuery; @Singleton public class FeedSubscriptionDAO extends GenericDAO { @@ -29,34 +29,34 @@ public class FeedSubscriptionDAO extends GenericDAO { } public FeedSubscription findById(User user, Long id) { - List subs = newQuery().from(sub).where(sub.user.eq(user), sub.id.eq(id)).leftJoin(sub.feed).fetch() - .leftJoin(sub.category).fetch().list(sub); + List subs = query().selectFrom(sub).where(sub.user.eq(user), sub.id.eq(id)).leftJoin(sub.feed).fetchJoin() + .leftJoin(sub.category).fetchJoin().fetch(); return initRelations(Iterables.getFirst(subs, null)); } public List findByFeed(Feed feed) { - return newQuery().from(sub).where(sub.feed.eq(feed)).list(sub); + return query().selectFrom(sub).where(sub.feed.eq(feed)).fetch(); } public FeedSubscription findByFeed(User user, Feed feed) { - List subs = newQuery().from(sub).where(sub.user.eq(user), sub.feed.eq(feed)).list(sub); + List subs = query().selectFrom(sub).where(sub.user.eq(user), sub.feed.eq(feed)).fetch(); return initRelations(Iterables.getFirst(subs, null)); } public List findAll(User user) { - List subs = newQuery().from(sub).where(sub.user.eq(user)).leftJoin(sub.feed).fetch().leftJoin(sub.category) - .fetch().list(sub); + List subs = query().selectFrom(sub).where(sub.user.eq(user)).leftJoin(sub.feed).fetchJoin() + .leftJoin(sub.category).fetchJoin().fetch(); return initRelations(subs); } public List findByCategory(User user, FeedCategory category) { - HibernateQuery query = newQuery().from(sub).where(sub.user.eq(user)); + HibernateQuery query = query().selectFrom(sub).where(sub.user.eq(user)); if (category == null) { query.where(sub.category.isNull()); } else { query.where(sub.category.eq(category)); } - return initRelations(query.list(sub)); + return initRelations(query.fetch()); } public List findByCategories(User user, List categories) { diff --git a/src/main/java/com/commafeed/backend/dao/GenericDAO.java b/src/main/java/com/commafeed/backend/dao/GenericDAO.java index db2a61ae..3a6884ad 100644 --- a/src/main/java/com/commafeed/backend/dao/GenericDAO.java +++ b/src/main/java/com/commafeed/backend/dao/GenericDAO.java @@ -1,22 +1,25 @@ package com.commafeed.backend.dao; -import io.dropwizard.hibernate.AbstractDAO; - import java.util.Collection; import org.hibernate.SessionFactory; import com.commafeed.backend.model.AbstractModel; -import com.mysema.query.jpa.hibernate.HibernateQuery; +import com.querydsl.jpa.hibernate.HibernateQueryFactory; + +import io.dropwizard.hibernate.AbstractDAO; public abstract class GenericDAO extends AbstractDAO { + private HibernateQueryFactory factory; + protected GenericDAO(SessionFactory sessionFactory) { super(sessionFactory); + this.factory = new HibernateQueryFactory(() -> currentSession()); } - protected HibernateQuery newQuery() { - return new HibernateQuery(currentSession()); + protected HibernateQueryFactory query() { + return factory; } public void saveOrUpdate(T model) { diff --git a/src/main/java/com/commafeed/backend/dao/UserDAO.java b/src/main/java/com/commafeed/backend/dao/UserDAO.java index 3bc94cb2..8b51e95c 100644 --- a/src/main/java/com/commafeed/backend/dao/UserDAO.java +++ b/src/main/java/com/commafeed/backend/dao/UserDAO.java @@ -19,18 +19,18 @@ public class UserDAO extends GenericDAO { } public User findByName(String name) { - return newQuery().from(user).where(user.name.equalsIgnoreCase(name)).uniqueResult(user); + return query().selectFrom(user).where(user.name.equalsIgnoreCase(name)).fetchOne(); } public User findByApiKey(String key) { - return newQuery().from(user).where(user.apiKey.equalsIgnoreCase(key)).uniqueResult(user); + return query().selectFrom(user).where(user.apiKey.equalsIgnoreCase(key)).fetchOne(); } public User findByEmail(String email) { - return newQuery().from(user).where(user.email.equalsIgnoreCase(email)).uniqueResult(user); + return query().selectFrom(user).where(user.email.equalsIgnoreCase(email)).fetchOne(); } public long count() { - return newQuery().from(user).count(); + return query().selectFrom(user).fetchCount(); } } diff --git a/src/main/java/com/commafeed/backend/dao/UserRoleDAO.java b/src/main/java/com/commafeed/backend/dao/UserRoleDAO.java index 3c149499..303d454e 100644 --- a/src/main/java/com/commafeed/backend/dao/UserRoleDAO.java +++ b/src/main/java/com/commafeed/backend/dao/UserRoleDAO.java @@ -25,11 +25,11 @@ public class UserRoleDAO extends GenericDAO { } public List findAll() { - return newQuery().from(role).leftJoin(role.user).fetch().distinct().list(role); + return query().selectFrom(role).leftJoin(role.user).fetchJoin().distinct().fetch(); } public List findAll(User user) { - return newQuery().from(role).where(role.user.eq(user)).distinct().list(role); + return query().selectFrom(role).where(role.user.eq(user)).distinct().fetch(); } public Set findRoles(User user) { diff --git a/src/main/java/com/commafeed/backend/dao/UserSettingsDAO.java b/src/main/java/com/commafeed/backend/dao/UserSettingsDAO.java index 92e8afd5..0553ef84 100644 --- a/src/main/java/com/commafeed/backend/dao/UserSettingsDAO.java +++ b/src/main/java/com/commafeed/backend/dao/UserSettingsDAO.java @@ -20,6 +20,6 @@ public class UserSettingsDAO extends GenericDAO { } public UserSettings findByUser(User user) { - return newQuery().from(settings).where(settings.user.eq(user)).uniqueResult(settings); + return query().selectFrom(settings).where(settings.user.eq(user)).fetchFirst(); } }