如何将带有子查询的SQL语句转换成HQL
How to convert SQL statement with sub query into HQL
我有一个相对简单的 SQL 查询:
SELECT TOP 10 * From Occasion
WHERE
(Occasion.StateId = @StateId AND Occasion.EndTime < @EndTime)
OR
(
Occasion.StateId = @StateId
AND
@StartTime < (SELECT TOP 1 Time FROM StartTime where Occasion.OccasionId = StartTime.OccasionId ORDER BY Time DESC)
)
但我不知道如何将其转换为 HQL。我做了很多尝试,但一直无法让它发挥作用。我收到的大部分是编译时错误,这意味着我的语法不正确。任何帮助将不胜感激。
以下是我的映射文件的相关部分:
<id name="Id" column="OccasionId" type="guid">
<generator class="guid" />
</id>
<bag name="StartTimeCollection" lazy="false" access="nosetter.camelcase-underscore" table="StartTime">
<key column="OccasionId" />
<element type="datetime2">
<column sql-type="datetime2(7)" not-null="true" name="Time" />
</element>
</bag>
<property name="EndTime" type="datetime2">
<column name="EndTime" sql-type="datetime2(7)" not-null="false" />
</property>
<many-to-one not-null="true" lazy="false" fetch="join" name="_state" column="StateId" access="field" />
<property name="Status" formula="StateId" access="readonly" insert="false" update="false" />
<id name="Id" column="OccasionStateId">
<generator class="native" />
</id>
<discriminator column="Name" type="string">
<column name="Name" sql-type="nvarchar(256)" />
</discriminator>
<subclass name="PendingState" discriminator-value="Pending" />
<subclass name="StartedState" discriminator-value="Started" />
<subclass name="EndedState" discriminator-value="Ended" />
我不知道你的 class 型号,所以我不得不猜测。
假设 Occasion 与 StartTime 存在一对多关系(它只是时间的原始值列表):
From Occasion o
WHERE
(o.StateId = :StateId
AND o.EndTime < :EndTime)
OR
(
o.StateId = :StateId
AND :StartTime < max(elements(o.StartTimes))
)
(TOP 10 已完成 .SetMaxresults(10)
。)
我有一个相对简单的 SQL 查询:
SELECT TOP 10 * From Occasion
WHERE
(Occasion.StateId = @StateId AND Occasion.EndTime < @EndTime)
OR
(
Occasion.StateId = @StateId
AND
@StartTime < (SELECT TOP 1 Time FROM StartTime where Occasion.OccasionId = StartTime.OccasionId ORDER BY Time DESC)
)
但我不知道如何将其转换为 HQL。我做了很多尝试,但一直无法让它发挥作用。我收到的大部分是编译时错误,这意味着我的语法不正确。任何帮助将不胜感激。
以下是我的映射文件的相关部分:
<id name="Id" column="OccasionId" type="guid">
<generator class="guid" />
</id>
<bag name="StartTimeCollection" lazy="false" access="nosetter.camelcase-underscore" table="StartTime">
<key column="OccasionId" />
<element type="datetime2">
<column sql-type="datetime2(7)" not-null="true" name="Time" />
</element>
</bag>
<property name="EndTime" type="datetime2">
<column name="EndTime" sql-type="datetime2(7)" not-null="false" />
</property>
<many-to-one not-null="true" lazy="false" fetch="join" name="_state" column="StateId" access="field" />
<property name="Status" formula="StateId" access="readonly" insert="false" update="false" />
<id name="Id" column="OccasionStateId">
<generator class="native" />
</id>
<discriminator column="Name" type="string">
<column name="Name" sql-type="nvarchar(256)" />
</discriminator>
<subclass name="PendingState" discriminator-value="Pending" />
<subclass name="StartedState" discriminator-value="Started" />
<subclass name="EndedState" discriminator-value="Ended" />
我不知道你的 class 型号,所以我不得不猜测。
假设 Occasion 与 StartTime 存在一对多关系(它只是时间的原始值列表):
From Occasion o
WHERE
(o.StateId = :StateId
AND o.EndTime < :EndTime)
OR
(
o.StateId = :StateId
AND :StartTime < max(elements(o.StartTimes))
)
(TOP 10 已完成 .SetMaxresults(10)
。)