JPA :TypedQuery иногда возвращает null вместо NoResultException

Обычно я работаю с NoResultException, чтобы вернуть "пустой" объект, например. пустой список ошибок или новый BigInteger ("0" ), если я не получаю результатов от TypedQuery. Теперь оказалось, что это иногда не работает. Внезапно getSingleResult ()возвращает null вместо того, чтобы вызвать исключение NoResultException, и я не понимаю, почему. Посмотрите этот пример:

public BigInteger pointsSumByAccountId(long accountId)
{
    try
    {
        TypedQuery<BigInteger> pointsQuery = entityManager.createNamedQuery(Points.SumByAccountId, BigInteger.class);
        pointsQuery.setParameter(Points.AccountIdParameter, accountId);

        return pointsQuery.getSingleResult();
    }
    catch (NoResultException e)
    {
        return new BigInteger("0");
    }
}

Важная часть Entity...

@NamedQueries({@NamedQuery(name = "Points.sumByAccountId", query = "select sum(p.value) from Points p where p.validFrom <= current_timestamp() and p.validThru >= current_timestamp() and p.account.id = :accountId")})
public class Points
{
    private static final long serialVersionUID = -15545239875670390L;

    public static final String SumByAccountId = Points.class.getSimpleName() + ".sumByAccountId";
    public static final String AccountIdParameter = "accountId";
.
.
.

Если я использую accountId, который не дает никаких результатов, я получаю null вместо NoResultException. Любые идеи, почему это так? Даже Javadoc TypedQuery говорит, что он должен возвращать NoResultException:

/**
 * Execute a SELECT query that returns a single result.
 *
 * @return the result
 *
 * @throws NoResultException if there is no result
 * @throws NonUniqueResultException if more than one result
 * @throws IllegalStateException if called for a Java
 * Persistence query language UPDATE or DELETE statement
 * @throws QueryTimeoutException if the query execution exceeds
 * the query timeout value set and only the statement is
 * rolled back
 * @throws TransactionRequiredException if a lock mode has
 * been set and there is no transaction
 * @throws PessimisticLockException if pessimistic locking
 * fails and the transaction is rolled back
 * @throws LockTimeoutException if pessimistic locking
 * fails and only the statement is rolled back
 * @throws PersistenceException if the query execution exceeds
 * the query timeout value set and the transaction
 * is rolled back
 */
X getSingleResult();
8
задан Bevor 24 April 2012 в 10:31
поделиться