package org.openlca.core.database;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A helper class for common queries.
*/
public class Query {
private Logger log = LoggerFactory.getLogger(getClass());
private IDatabase database;
private Query(IDatabase database) {
this.database = database;
}
public static Query on(IDatabase database) {
return new Query(database);
}
/**
* Searches an entity of the given type with the given name. The type must
* have a string field 'name'. If no such type is contained in the database,
* null is returned.
*/
public <T> T getForName(Class<T> type, String name) {
log.trace("query {} for name {}", type, name);
BaseDao<T> dao = new BaseDao<>(type, database);
String jpql = "select t from " + type.getSimpleName()
+ " t where t.name = :name";
Map<String, String> map = new HashMap<>();
map.put("name", name);
return dao.getFirst(jpql, map);
}
public <T> List<T> getAllForName(Class<T> type, String name) {
if (name == null)
return null;
String jpql = "select e from " + type.getSimpleName()
+ " e where e.name = :name";
return getAll(type, jpql, Collections.singletonMap("name", name));
}
public <T> List<T> getAll(Class<T> type, String jpql) {
Map<String, Object> map = new HashMap<>();
return getAll(type, jpql, map);
}
public <T> List<T> getAll(Class<T> type, String jpql,
Map<String, ? extends Object> params) {
log.trace("Get all {} with query {}", type, jpql);
EntityManager em = createManager();
try {
TypedQuery<T> query = em.createQuery(jpql, type);
if (params != null)
for (String key : params.keySet()) {
query.setParameter(key, params.get(key));
}
List<T> results = query.getResultList();
log.debug("{} results", results.size());
return results;
} finally {
em.close();
}
}
public <T> T getFirst(Class<T> type, String jpql,
Map<String, ? extends Object> params) {
List<T> all = getAll(type, jpql, params);
if (all == null || all.isEmpty())
return null;
return all.get(0);
}
private EntityManager createManager() {
return database.getEntityFactory().createEntityManager();
}
}