/******************************************************************************* * Copyright 2013 * Ubiquitous Knowledge Processing (UKP) Lab * Technische Universität Darmstadt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package de.tudarmstadt.ukp.csniper.webapp.security.dao; import java.beans.PropertyDescriptor; import java.util.ArrayList; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import org.springframework.beans.BeanWrapper; import org.springframework.beans.PropertyAccessorFactory; import org.springframework.transaction.annotation.Transactional; public abstract class AbstractDao<T, K> { @PersistenceContext protected EntityManager entityManager; @Transactional public void create(final T aModel) { entityManager.persist(aModel); entityManager.flush(); } @Transactional public T update(final T aModel) { return entityManager.merge(aModel); } public abstract int delete(final K aId); @Transactional public <TT> List<TT> getUnique(Class<?> aType, String aProperty, Class<TT> aPropertyType) { return entityManager.createQuery( "SELECT DISTINCT o." + aProperty + " FROM " + aType.getName() + " o ORDER BY o." + aProperty, aPropertyType).getResultList(); } /** * Finds all entities that have the same type as the given example and all fields are equal to * non-null fields in the example. */ protected <TT> CriteriaQuery<TT> queryByExample(TT aExample, String aOrderBy, boolean aAscending) { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); @SuppressWarnings("unchecked") CriteriaQuery<TT> query = cb.createQuery((Class<TT>) aExample.getClass()); @SuppressWarnings("unchecked") Root<TT> root = query.from((Class<TT>) aExample.getClass()); query.select(root); List<Predicate> predicates = new ArrayList<Predicate>(); BeanWrapper a = PropertyAccessorFactory.forBeanPropertyAccess(aExample); // Iterate over all properties for (PropertyDescriptor d : a.getPropertyDescriptors()) { Object value = a.getPropertyValue(d.getName()); // Only consider writeable properties. This filters out e.g. the "class" (getClass()) // property. if (value != null && a.isWritableProperty(d.getName())) { predicates.add(cb.equal(root.get(d.getName()), value)); } } if (!predicates.isEmpty()) { query.where(predicates.toArray(new Predicate[predicates.size()])); } if (aOrderBy != null) { if (aAscending) { query.orderBy(cb.asc(root.get(aOrderBy))); } else { query.orderBy(cb.desc(root.get(aOrderBy))); } } return query; } }