/** * */ package net.i2geo.comped.dao.hibernate; import java.util.ArrayList; import java.util.List; import net.i2geo.comped.dao.GenericTopicDao; import net.i2geo.comped.model.ConcreteCompetency; import net.i2geo.comped.model.Topic; import org.appfuse.dao.hibernate.GenericDaoHibernate; import org.springframework.orm.hibernate3.HibernateTemplate; /** * @author Martin Homik * */ abstract public class GenericTopicDaoHibernate<T extends Topic> extends GenericDaoHibernate<T, Long> implements GenericTopicDao<T> { private Class<T> persistedClass = null; private String persistedClassName = null; public GenericTopicDaoHibernate(Class<T> clazz) { super(clazz); this.persistedClass = clazz; this.persistedClassName = clazz.getName(); } protected Class<T> getPersistedClass() { return persistedClass; } @SuppressWarnings("unchecked") public T findByUri(String uri) { List<T> result = getHibernateTemplate().find( "from " + persistedClassName + " where uri like ?", uri); if (result == null || result.isEmpty()) { return null; } return result.get(0); } @SuppressWarnings("unchecked") public List<T> findByLastCreated(int number) { // need to get a new HibernateTemplate to set own constraints HibernateTemplate ht = new HibernateTemplate(getSessionFactory()); ht.setMaxResults(number); return ht.find("from " + persistedClassName + " t ORDER BY t.created desc"); } @SuppressWarnings("unchecked") public List<T> findByLastModified(int number) { // need to get a new HibernateTemplate to set own constraints HibernateTemplate ht = new HibernateTemplate(getSessionFactory()); ht.setMaxResults(number); return ht.find("from " + persistedClassName + " t ORDER BY t.modified desc"); } public List<T> findByNameExact(String token, String language) { return findByNameExact(token, language, -1); } public List<T> findByNameExact(String token, String language, int number) { return findByName(token, language, false, number); } public List<T> findByNameLike(String token, String language) { return findByNameLike(token, language, -1); } public List<T> findByNameLike(String token, String language, int number) { return findByName(token, language, true, number); } @SuppressWarnings("unchecked") public List<T> findByName(String token, String language, boolean like, int number) { String[] names = {"token", "language"}; Object[] values = {token.toLowerCase(), language}; String nameClause; if (like) { nameClause = "where LOWER(name.name) like :token "; } else { nameClause = "where LOWER(name.name)=:token "; } HibernateTemplate ht = null; if (number != -1) { ht = getHibernateTemplate(); } else { // need to get a new HibernateTemplate to set own constraints ht = new HibernateTemplate(getSessionFactory()); ht.setMaxResults(number); } return ht.findByNamedParam( "select distinct c " + "from " + persistedClassName + " as c, Name as name " + nameClause + "and name.locale=:language " + "and name member of c.names)" , names, values); } /* * (non-Javadoc) * @see net.i2geo.comped.dao.GenericTopicDao#findByConcreteCompetency(net.i2geo.comped.model.Topic) */ @SuppressWarnings("unchecked") public List<ConcreteCompetency> findLinkedConcreteCompetency(T topic) { List<ConcreteCompetency> result = getHibernateTemplate().find( "from ConcreteCompetency c where ? member of c.topics", topic); if (result == null) { return new ArrayList<ConcreteCompetency>(); } return result; } }