所以我有这个很长的复杂本机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中进行简单的小查询,但是如果我从另一个选择(如查询)中选择一个复合选择,该怎么办?
谢谢
HQL在where语句中支持子查询,因此where中的子查询不会引起麻烦。
我认为您的from语句中的子查询没有必要,您应该能够更改查询而不再拥有它。
删除查询的分页部分可能会有所帮助。该分页应通过在HQL查询对象上调用.SetFirstResult(indexCalculatedFromYourPage)和来完成.SetMaxResults(yourPageSize)。
.SetFirstResult(indexCalculatedFromYourPage)
.SetMaxResults(yourPageSize)
当然,您需要在实体上映射所有必需的列。您的大部分查询看起来已经与我兼容。 如果也映射了相关实体,则可以通过避免显式地编写相关表的连接条件来简化where子查询。
注意:您的查询看起来像一个“多条件”搜索查询。与编写一个不考虑所有参数的查询(并支持它们为空/未指定)相比,动态编写查询以忽略未提供的参数通常更容易(顺便说一句对于性能而言更好)。为此,最好使用诸如queryover或linq-to- nhibernate之类的查询api 。
编辑:我现在意识到您已经将问题标记为nhibernate(.Net)和hibernate(Java)。我链接的两个API用于NHibernate。如果您使用的是Java,则有hibernate- criteria api,也许还有一些我不知道的API。