@Override public <T> TypedQuery<T> createNamedQuery(final String name, final Class<T> resultClass) { final TypedQueryFactory factory = namedQueries.get(name); if (factory == null) throw new IllegalArgumentException("No named query \"" + name + "\""); return factory.createIfCompatible(resultClass, this); }
/** * Creates an instance of the TypedQuery associated with this factory if its * result type is assignable to the given type. * * @param resultType * The expected result type * @param entityManager * the EntityManager the query will be executed in. Must not be null. * @param <T> * The result type of the queries produced by this factory * @return A new instance of TypedQuery, whose result type is assignable to * {@code resultType}. * @throws IllegalArgumentException * if the query's result type is not assignable to the given type. */ public <T> TypedQuery<T> createIfCompatible(Class<T> resultType, ErraiEntityManager entityManager) { Class<?> resultSupertype = actualResultType; while (resultSupertype != null) { if (resultType == resultSupertype) { return createQuery(entityManager); } resultSupertype = resultSupertype.getSuperclass(); } throw new IllegalArgumentException("Expected return type " + resultType + " is not assignable from actual return type " + actualResultType); }