gpt4 book ai didi

java - 什么时候可以抛出 NoSuchResult

转载 作者:搜寻专家 更新时间:2023-11-01 03:32:04 24 4
gpt4 key购买 nike

我继承了一个系统,该系统有一个相当奇怪的错误,该错误可能每 6 个月发生一次,应用程序突然失去对数据库数据的跟踪。

系统具有冗余,有 2 个服务器被安排在同一时间运行相同的功能。它们都获得相同的函数输入数据,并且它们都与同一个 postgres 数据库对话,但是两台机器上的行为不同。

正在执行的函数正在调用数据库并检查是否存在具有输入参数提供的指定 id 的行,如果存在则执行 A(),否则 B()

问题是一个服务器执行 A() 而另一个服务器执行 B()。我到处搜索,没有代码写入此表或从中删除。因此,出于各种原因,我认为它们应该都执行相同的代码。

这是从数据库中获取的代码:

@PersistenceContext(unitName = "backend-persistence")
private EntityManager em;
public Optional<OfferEntity> getOfferFromOfferId(final long offerId, final String countryAlias, final String langauageAlias) {

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<OfferEntity> cq = cb.createQuery(OfferEntity.class);
Root<OfferEntity> from = cq.from(OfferEntity.class);
cq.select(from);
cq.where(cb.and(cb.equal(from.get(OfferEntity_.offerId), offerId),
cb.equal(from.get(OfferEntity_.country), countryAlias),
cb.equal(from.get(OfferEntity_.language), langauageAlias)));

try {

return Optional.of(em.createQuery(cq).getSingleResult());
} catch (NoResultException nre) {

return Optional.empty();
}
}

而且我从其中一台服务器而不是另一台服务器获得了一个空的可选。

所以我想作为一个 tl;dr,我是否误解了 NoResultException 以及在什么具体情况下可以抛出它?此外,如果没有与查询匹配的行。

最佳答案

只有当您确定会得到一个结果时,您才能使用 getSingleResult()。在所有其他情况下,您必须使用 getResultList()

来自 javax.persistence.Query getSingleResult() 的 API 文档:

java.lang.Object getSingleResult()

Execute a SELECT query that returns a single untyped result.

Returns:
the result

Throws:
NoResultException - if there is no result
NonUniqueResultException - if more than one result
IllegalStateException - if called for a Java Persistence query language UPDATE or DELETE statement
QueryTimeoutException - if the query execution exceeds the query timeout value set and only the statement is rolled back
TransactionRequiredException - if a lock mode has been set and there is no transaction
PessimisticLockException - if pessimistic locking fails and the transaction is rolled back
LockTimeoutException - if pessimistic locking fails and only the statement is rolled back
PersistenceException - if the query execution exceeds the query timeout value set and the transaction is rolled back

关于java - 什么时候可以抛出 NoSuchResult,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48445386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com