所以我有这个很长的复杂的 Native SQLQuery :
string hql =
@"SELECT *
FROM
(SELECT a.*, rownum r__
FROM
(select f2.filmid,
f2.realisateurid,
f2.titre,
f2.annesortie,
f2.langue,
f2.duree,
f2.resume,
f2.poster,
f2.qtytotal,
f2.qtydisponible from film f2
where f2.filmid in (
select distinct f.filmid
from film f, filmpays fp, pays p, filmgenre fg, genre g, informationpersonnel director, role r, informationpersonnel actor
where f.filmid = fp.filmid
and fp.paysid = p.paysid
and f.filmid = fg.filmid
and fg.genreid = g.genreid
and f.realisateurid = director.personelid
and f.filmid = r.filmid
and r.personelid = actor.personelid
and f.qtydisponible > 0
and upper(f.titre) LIKE :titre
and f.annesortie >= :anneeLow AND f.annesortie <= :anneeHigh
and upper(g.Nomgenre) LIKE :genre
and upper(f.Langue) LIKE :langue
and upper(p.Nom) LIKE :pays
and upper(director.nom) LIKE :realisateur
and upper(actor.nom) LIKE :acteur)
order by f2.annesortie DESC, f2.titre) a
WHERE rownum < ((:page * 8) +1 ))
WHERE r__ >= (((:page - 1) *8) +1) ";
/*Begin transaction */
ITransaction tx = s.BeginTransaction();
IQuery query = s.CreateQuery(hql);
query.SetString("titre", "%" + sp.Title.ToUpper() + "%");
query.SetInt32("anneeLow", sp.YearLow);
query.SetInt32("anneeHigh", sp.YearHigh);
query.SetString("pays", "%" + sp.Country.ToUpper() + "%");
query.SetString("langue", "%" + sp.Lang.ToUpper() + "%");
query.SetString("genre", "%" + sp.Genre.ToUpper() + "%");
query.SetString("realisateur", "%" + sp.Director.ToUpper() + "%");
query.SetString("acteur", "%" + sp.Actor.ToUpper() + "%");
query.SetInt32("page", page);
IList<Film> movies = query.List<Film>();
tx.Commit();
return movies;
我正在尝试以 100% hql 的方式写作
类似于
的东西IList<Cat> moreCats = sess.CreateQuery(
"from Cat as cat where " +
"cat.Name = 'Fritz' or cat.id = :id1 or cat.id = :id2"
).SetInt64("id1", id1)
.SetInt67("id2", id2)
.List<Cat>();
查阅 hql 文档后,我了解了如何在 hql 中进行简单的小型查询,但是如果我从另一个选择中进行复杂的选择(例如我的查询),我应该如何进行?
谢谢
最佳答案
HQL支持where语句中的子查询,因此where中的子查询不会造成麻烦。
我认为 from 语句中的子查询没有必要,您应该能够更改查询以不再拥有它。
删除查询的分页部分可能会有所帮助。此分页应通过在 HQL 查询对象上调用 .SetFirstResult(indexCalculatedFromYourPage)
和 .SetMaxResults(yourPageSize)
来完成。
当然,您需要在实体上映射所有必需的列。您的大部分查询看起来已经与我兼容。
如果您也映射相关实体,则可以通过避免显式编写相关表的连接条件来简化 where 子查询。
注意:您的查询看起来像“多条件”搜索查询。与编写一个考虑所有参数(并支持它们为空/未指定)的查询相比,动态编写查询以忽略未提供的参数通常更容易(顺便说一下,性能更好)。为此,最好使用像 queryover 这样的查询 api或linq-to-nhibernate .
编辑:我现在意识到您已将您的问题标记为 nhibernate (.Net) 和 hibernate ( java )。我链接的两个 api 适用于 NHibernate。如果您使用 Java,则有 hibernate-criteria api,也许还有其他一些我不知道的。
关于sql - 如何将此 native SQL 查询转换为 HQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42462497/