考虑,对于 id id
的某些特定数据库条目,数据库中的日期间隔,从 BEGIN_DATE
到 END_DATE
,表示为(BEGIN_DATE
,END_DATE
)。
给定两个构成间隔的新日期 (newBeginDate
, newEndDate
),我必须更新 (BEGIN_DATE
,END_DATE
) 以便生成的间隔包含所有 4 个日期。换句话说,我想将这两个间隔相加(并且由于我正在添加它们,结果间隔可能会保持不变或增加,但绝不会缩小)。
几个例子:
如果 (BEGIN_DATE
,END_DATE
) = (1 月 10 日
,1 月 20 日
),则:
(
BEGIN_DATE
,END_DATE
) + (1 月 15 日
,1 月 25 日
) = (1 月 10 日
,1 月 25 日
)(
BEGIN_DATE
,END_DATE
) + (1 月 5 日
,1 月 15 日
) = (1 月 5 日
,1 月 20 日
)(
BEGIN_DATE
,END_DATE
) + (1 月 5 日
,1 月 25 日
) = (1 月 5 日
,1 月 25 日
)(
BEGIN_DATE
,END_DATE
) + (1 月 15 日
,1 月 15 日
) = (1 月 10 日
,1 月 20 日
)(
BEGIN_DATE
,END_DATE
) + (1 月 10 日
,1 月 13 日
) = (1 月 10 日
,1 月 20 日
)
以下两个查询共同实现了这个目标。第一个更新 BEGIN_DATE
,第二个更新 END_DATE
:
session.createQuery(
"update APPOINTMENTS " +
"set BEGIN_DATE = :newBeginDate " +
"where " +
"(BEGIN_DATE is null or BEGIN_DATE > :newBeginDate) " +
"and ID = :id ")
.setParameter("newBeginDate", newBeginDate)
.setParameter("id", id)
.executeUpdate();
session.createQuery(
"update APPOINTMENTS " +
"set END_DATE = :newEndDate " +
"where " +
"(END_DATE is null or END_DATE < :newEndDate) " +
"and ID = :id ")
.setParameter("newEndDate", newEndDate)
.setParameter("id", id)
.executeUpdate();
我的问题是: 如何在单个查询中完成?
最佳答案
SQL 在涉及更复杂的编程结构时受到限制,因此由于您使用 Hibernate,我将只读取约会实体实例并更新其字段。这将需要两个查询,一个用于读取,一个用于更新,但它仍然只是一个更新语句,并且是最具可读性的解决方案。
如果您仍然只需要一个更新语句而别无其他,则可以使用 case
将您的两个语句合并为一个:
update APPOINTMENTS
set BEGIN_DATE = case when (BEGIN_DATE is null or BEGIN_DATE > :newBeginDate) then :newBeginDate else BEGIN_DATE end,
END_DATE = case when (END_DATE is null or END_DATE < :newEndDate) then :newEndDate else END_DATE end
where (BEGIN_DATE is null or BEGIN_DATE > :newBeginDate or END_DATE is null or END_DATE < :newEndDate)
and ID = :id
关于mysql - 如何更新数据库中的日期间隔(Hibernate HQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44441031/