package io.trygvis.persistence.sql; import javax.persistence.FlushModeType; import javax.persistence.LockModeType; import javax.persistence.NoResultException; import javax.persistence.NonUniqueResultException; import javax.persistence.Parameter; import javax.persistence.PersistenceException; import javax.persistence.TemporalType; import javax.persistence.TypedQuery; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; public abstract class AbstractTypedQuery implements TypedQuery , FromResultSet { private final Connection c; private final SqlEntityMeta sqlEntity; private int firstResult; private int maxResults; protected AbstractTypedQuery(Connection c, SqlEntityMeta sqlEntity) { this.c = c; this.sqlEntity = sqlEntity; } @Override public TypedQuery setMaxResults(int maxResult) { this.maxResults = maxResult; return this; } @Override public TypedQuery setFirstResult(int firstResult) { this.firstResult = firstResult; return this; } @Override public TypedQuery setHint(String hintName, Object value) { throw new UnsupportedOperationException(); } @Override public TypedQuery setParameter(Parameter param, T value) { throw new UnsupportedOperationException(); } @Override public TypedQuery setParameter(Parameter param, Calendar value, TemporalType temporalType) { throw new UnsupportedOperationException(); } @Override public TypedQuery setParameter(Parameter param, Date value, TemporalType temporalType) { throw new UnsupportedOperationException(); } @Override public TypedQuery setParameter(String name, Object value) { throw new UnsupportedOperationException(); } @Override public TypedQuery setParameter(String name, Calendar value, TemporalType temporalType) { throw new UnsupportedOperationException(); } @Override public TypedQuery setParameter(String name, Date value, TemporalType temporalType) { throw new UnsupportedOperationException(); } @Override public TypedQuery setParameter(int position, Object value) { throw new UnsupportedOperationException(); } @Override public TypedQuery setParameter(int position, Calendar value, TemporalType temporalType) { throw new UnsupportedOperationException(); } @Override public TypedQuery setParameter(int position, Date value, TemporalType temporalType) { throw new UnsupportedOperationException(); } @Override public TypedQuery setFlushMode(FlushModeType flushMode) { throw new UnsupportedOperationException(); } @Override public TypedQuery setLockMode(LockModeType lockMode) { throw new UnsupportedOperationException(); } @Override public int executeUpdate() { throw new UnsupportedOperationException(); } @Override public int getMaxResults() { return maxResults; } @Override public int getFirstResult() { return firstResult; } @Override public Map getHints() { throw new UnsupportedOperationException(); } @Override public Set> getParameters() { throw new UnsupportedOperationException(); } @Override public Parameter getParameter(String name) { throw new UnsupportedOperationException(); } @Override public Parameter getParameter(String name, Class type) { throw new UnsupportedOperationException(); } @Override public Parameter getParameter(int position) { throw new UnsupportedOperationException(); } @Override public Parameter getParameter(int position, Class type) { throw new UnsupportedOperationException(); } @Override public boolean isBound(Parameter param) { throw new UnsupportedOperationException(); } @Override public T getParameterValue(Parameter param) { throw new UnsupportedOperationException(); } @Override public Object getParameterValue(String name) { throw new UnsupportedOperationException(); } @Override public Object getParameterValue(int position) { throw new UnsupportedOperationException(); } @Override public FlushModeType getFlushMode() { throw new UnsupportedOperationException(); } @Override public LockModeType getLockMode() { throw new UnsupportedOperationException(); } @Override public T unwrap(Class cls) { throw new UnsupportedOperationException(); } public List getResultList() { return getResultList(null, null); } public List getResultList(Integer offset, Integer limit) { String sql = "SELECT " + sqlEntity.defaultFields + " FROM " + sqlEntity.tableName; if (offset != null) { sql += " OFFSET " + offset; } if (limit != null) { sql += " LIMIT " + limit; } sql += ";"; List list = new ArrayList<>(); try (PreparedStatement stmt = c.prepareStatement(sql)) { ResultSet rs = stmt.executeQuery(); while (rs.next()) { list.add(fromResultSet(rs)); } return list; } catch (SQLException e) { throw new PersistenceException(e); } } public A getSingleResult() { List list = getResultList(null, 2); switch (list.size()) { case 1: return list.get(0); case 0: throw new NoResultException(); default: throw new NonUniqueResultException(); } } }