admin

如何将本机SQL查询转换为HQL

sql

所以我有这个很长的复杂本机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%高品质的方式编写

类似于

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中进行简单的小查询,但是如果我从另一个选择(如查询)中选择一个复合选择,该怎么办?

谢谢


阅读 178

收藏
2021-06-07

共1个答案

admin

HQL在where语句中支持子查询,因此where中的子查询不会引起麻烦。

我认为您的from语句中的子查询没有必要,您应该能够更改查询而不再拥有它。

删除查询的分页部分可能会有所帮助。该分页应通过在HQL查询对象上调用.SetFirstResult(indexCalculatedFromYourPage)和来完成.SetMaxResults(yourPageSize)

当然,您需要在实体上映射所有必需的列。您的大部分查询看起来已经与我兼容。
如果也映射了相关实体,则可以通过避免显式地编写相关表的连接条件来简化where子查询。

注意:您的查询看起来像一个“多条件”搜索查询。与编写一个不考虑所有参数的查询(并支持它们为空/未指定)相比,动态编写查询以忽略未提供的参数通常更容易(顺便说一句对于性能而言更好)。为此,最好使用诸如queryoverlinq-to-
nhibernate之
类的查询api 。

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

2021-06-07