2017-02-25 88 views
2

所以我有这个长期配合物SQLQuery对原住民:如何将这种原生SQL查询转换为一个HQL

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中做一个简单的小查询,但是如果我有一个complexe从另一个select中选择,比如我的查询,我该如何继续?

谢谢

回答

3

HQL支持在声明中,所以在那里子查询应该不会造成麻烦的子查询。

你的from语句中的子查询并不需要我,你应该能够改变你的查询,让它不再需要它。

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

当然,您需要映射实体上的所有必需列。大多数查询看起来已经与我兼容。
如果您也映射相关实体,则可以通过避免必须明确写入相关表的联接条件来简化where子查询。

注意:您的查询看起来像一个“多标准”搜索查询。与其写一个查询考虑所有参数(并且支持它们是空的/未指定的),通常更容易(并且通过这种方式更好地执行性能)动态地编写查询以忽略未提供的参数。为此,最好使用查询API,如

编辑:我现在意识到你已经标记为(.Net)和(Java)的问题。我已经链接的两个API是NHibernate。如果你使用的是Java,那么就是 api,也许还有一些我不知道的。

+0

我希望我可以upvote你100次。澄清你的时间,非常感谢你 – napi15