Java tutorial
/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.store.dao; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.hibernate.Query; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import com.enonic.cms.framework.cache.CacheFacade; import com.enonic.cms.framework.cache.CacheManager; import com.enonic.cms.framework.hibernate.support.InClauseBuilder; import com.enonic.cms.framework.hibernate.support.SelectBuilder; import com.enonic.cms.core.content.ContentEntity; import com.enonic.cms.core.content.ContentKey; import com.enonic.cms.core.content.ContentMap; import com.enonic.cms.core.content.ContentSpecification; import com.enonic.cms.core.content.ContentVersionEntity; import com.enonic.cms.core.content.RelatedContentEntity; import com.enonic.cms.core.content.category.CategoryEntity; import com.enonic.cms.core.content.category.CategoryKey; import com.enonic.cms.core.content.contenttype.ContentTypeEntity; import com.enonic.cms.core.content.resultset.RelatedChildContent; import com.enonic.cms.core.content.resultset.RelatedParentContent; import com.enonic.cms.store.support.EntityPageList; @Repository("contentDao") public class ContentEntityDao extends AbstractBaseEntityDao<ContentEntity> implements ContentDao { private CacheFacade entityCache; public ContentEntity findByKey(ContentKey contentKey) { return get(ContentEntity.class, contentKey); } public ContentMap findByKeys(final FindContentByKeysCommand command) { final FindContentByKeysQuerier findContentByKeysQuerier = new FindContentByKeysQuerier( getHibernateTemplate().getSessionFactory().getCurrentSession(), command.getContentEagerFetches(), command.isFetchEntitiesAsReadOnly()); final FindContentByKeysCommandExecutor commandExecutor = new FindContentByKeysCommandExecutor(entityCache, getHibernateTemplate(), findContentByKeysQuerier); return commandExecutor.execute(command.getContentKeys(), command.isByPassCache()); } @SuppressWarnings("unchecked") public List<ContentKey> findBySpecification(ContentSpecification specification, String orderBy, int count) { Query compiled = getHibernateTemplate().getSessionFactory().getCurrentSession() .createQuery(getContentKeysHQL(specification, orderBy, false)); compiled.setCacheable(true); compiled.setMaxResults(count); @SuppressWarnings({ "unchecked" }) List<ContentKey> list = compiled.list(); List<ContentKey> contentKeys = new ArrayList<ContentKey>(); for (ContentKey row : list) { contentKeys.add(row); } return contentKeys; } private String getContentKeysHQL(ContentSpecification specification, String orderBy, boolean count) { final SelectBuilder hqlQuery = new SelectBuilder(0); if (count) { hqlQuery.addSelect("count (c.key) "); } else { hqlQuery.addSelect("c.key"); } hqlQuery.addFromTable("ContentEntity", "c", SelectBuilder.NO_JOIN, null); applyIsDeletedFilter(specification, hqlQuery); applyAssignedToContentsHql(specification, hqlQuery); if (orderBy != null) { hqlQuery.addOrderBy(orderBy); } return hqlQuery.toString(); } private void applyAssignedToContentsHql(ContentSpecification specification, SelectBuilder hqlQuery) { if (specification.getAssignee() != null) { hqlQuery.addFilter("AND", "c.assignee = '" + specification.getAssignee().getKey().toString() + "'"); } if (specification.assignedDraftsOnly()) { hqlQuery.addFilter("AND", "c.draftVersion != null"); } } private void applyIsDeletedFilter(ContentSpecification specification, final SelectBuilder hqlQuery) { if (!specification.doIncludeDeleted()) { hqlQuery.addFilter("AND", "c.deleted = 0"); } } public Collection<RelatedChildContent> findRelatedChildrenByKeys( RelatedChildContentQuery relatedChildContentQuery) { final FindRelatedChildrenCommand command = new FindRelatedChildrenCommand(entityCache, getHibernateTemplate()); return command.execute(relatedChildContentQuery); } public Collection<RelatedParentContent> findRelatedParentByKeys( final RelatedParentContentQuery relatedParentContentQuery) { final FindRelatedParentsCommand command = new FindRelatedParentsCommand(entityCache, getHibernateTemplate()); return command.execute(relatedParentContentQuery); } public List<ContentKey> findContentKeysByContentType(ContentTypeEntity contentType) { return findByNamedQuery(ContentKey.class, "ContentEntity.findContentKeysByContentTypeKey", new String[] { "contentTypeKey" }, new Object[] { contentType.getKey() }); } public List<ContentKey> findContentKeysByCategory(CategoryKey category) { return findByNamedQuery(ContentKey.class, "ContentEntity.findContentKeysByCategoryKey", new String[] { "categoryKey" }, new Object[] { category }); } @Override public boolean checkNameExists(CategoryEntity category, String name) { return 0L != findSingleByNamedQuery(Long.class, "ContentEntity.countContentInCategoryByName", new String[] { "categoryKey", "name" }, new Object[] { category.getKey(), name }); } @Override public long countContentByCategory(CategoryEntity category) { return findSingleByNamedQuery(Long.class, "ContentEntity.countContentByCategory", new String[] { "categoryKey" }, new Object[] { category.getKey() }); } public int getNumberOfRelatedParentsByKey(List<ContentKey> contentKeys) { return doGetNumberOfRelatedParentsByKey(contentKeys); } private int doGetNumberOfRelatedParentsByKey(List<ContentKey> contentKeys) { String hql = getNumberOfRelatedParentsByKeyHQL(contentKeys); Query compiled = getHibernateTemplate().getSessionFactory().getCurrentSession().createQuery(hql); compiled.setCacheable(true); @SuppressWarnings({ "unchecked" }) int count = ((Number) compiled.uniqueResult()).intValue(); return count; } public String getNumberOfRelatedParentsByKeyHQL(List<ContentKey> contentKeys) { final SelectBuilder hqlQuery = new SelectBuilder(0); hqlQuery.addSelect("count(*)"); hqlQuery.addFromTable(ContentVersionEntity.class.getName(), "cv", SelectBuilder.NO_JOIN, null); hqlQuery.addFromTable(RelatedContentEntity.class.getName(), "rc", SelectBuilder.NO_JOIN, null); hqlQuery.addFromTable(ContentEntity.class.getName(), "c", SelectBuilder.NO_JOIN, null); hqlQuery.addFilter("AND", "cv.key = rc.key.parentContentVersionKey"); hqlQuery.addFilter("AND", "c.mainVersion.key = cv.key"); hqlQuery.addFilter("AND", new InClauseBuilder<ContentKey>("rc.key.childContentKey", contentKeys) { public void appendValue(StringBuffer sql, ContentKey value) { sql.append(value.toString()); } }.toString()); hqlQuery.addFilter("AND", "c.deleted = 0"); return hqlQuery.toString(); } public int findCountBySpecification(ContentSpecification specification) { List<Long> result = getHibernateTemplate().find(getContentKeysHQL(specification, null, true)); if (result == null || result.size() == 0) { return 0; } Long count = result.get(0); return count.intValue(); } public List<ContentKey> findAll() { return findByNamedQuery(ContentKey.class, "ContentEntity.findAll"); } public EntityPageList<ContentEntity> findAll(int index, int count) { return findPageList(ContentEntity.class, "x.deleted = 0", index, count); } @Autowired public void setCacheManager(CacheManager cacheManager) { this.entityCache = cacheManager.getEntityCache(); } }