package org.openlca.core.database; import java.util.Collections; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; import org.openlca.core.model.CategorizedEntity; import org.openlca.core.model.Category; import org.openlca.core.model.descriptors.BaseDescriptor; import org.openlca.core.model.descriptors.CategorizedDescriptor; import com.google.common.base.Optional; public class CategorizedEntityDao<T extends CategorizedEntity, V extends CategorizedDescriptor> extends RootEntityDao<T, V> { public CategorizedEntityDao(Class<T> entityType, Class<V> descriptorType, IDatabase database) { super(entityType, descriptorType, database); } public List<V> getDescriptors(Optional<Category> category) { String sql = getDescriptorQuery(); if (category.isPresent()) { sql += " where f_category = ?"; List<Object[]> results = selectAll(sql, getDescriptorFields(), Collections.singletonList((Object) category.get().getId())); return createDescriptors(results); } else { sql += " where f_category is null"; List<Object[]> results = selectAll(sql, getDescriptorFields(), Collections.emptyList()); return createDescriptors(results); } } @Override protected V createDescriptor(Object[] queryResult) { V descriptor = super.createDescriptor(queryResult); if (descriptor != null) descriptor.setCategory((Long) queryResult[6]); return descriptor; } @Override protected String[] getDescriptorFields() { return new String[] { "id", "ref_id", "name", "description", "version", "last_change", "f_category" }; } public void updateCategory(BaseDescriptor model, Optional<Category> category) { String jpql = "update " + entityType.getSimpleName() + " e set e.category = :category where e.id = :id"; EntityManager em = createManager(); TypedQuery<?> query = em.createQuery(jpql, entityType); query.setParameter("id", model.getId()); query.setParameter("category", category.isPresent() ? category.get() : null); try { em.getTransaction().begin(); query.executeUpdate(); em.getTransaction().commit(); } catch (Exception e) { DatabaseException.logAndThrow(log, "failed to update category for " + entityType.getSimpleName(), e); } finally { em.close(); } } }