sql - 如何将此 native SQL 查询转换为 HQL

标签 sql hibernate nhibernate hql

所以我有这个很长的复杂的 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 子查询。

注意:您的查询看起来像“多条件”搜索查询。与编写一个考虑所有参数(并支持它们为空/未指定)的查询相比,动态编写查询以忽略未提供的参数通常更容易(顺便说一下,性能更好)。为此,最好使用像 这样的查询 api或 .

编辑:我现在意识到您已将您的问题标记为 (.Net) 和 ( java )。我链接的两个 api 适用于 NHibernate。如果您使用 Java,则有 api,也许还有其他一些我不知道的。

关于sql - 如何将此 native SQL 查询转换为 HQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42462497/

相关文章:

c# - 类中相关计算属性的设计模式?

.net - NHibernate:一个 session 中的更新不会反射(reflect)在另一个打开的 session 中

sql - 树数据结构的数据库结构

java - 在 Spring MVC + Postgres 上访问列元数据时出错

java - 使用具有 save(this) 方法的子类扩展 @Entity 注解类

java - 按多个条件拆分列表

sql-server - 大表(10,000,000 行)上的 Nhibernate 分页性能

sql - 避免多个列的单个表的多个左连接

sql - sql server 2008 中出现登录错误

Mysql:仅连接表左表的第一行