【问题标题】:How to give extra parameter with HQL join如何使用 HQL 连接提供额外参数
【发布时间】:2014-12-11 09:48:18
【问题描述】:

我想在 hql 中提供带有连接条件的额外参数。 在我写的 sql 查询中

select a.*,ur.fname,ur.lname
from 
atom as a
left join user as ur
on 
a.id=ur.id
left join album as al
on 
a.id=al.aid
and al.name='Profile'
left join post_images as pi
on 
a.id=pi.aid
and pi.is_album_cover='yes'
where
(ur.fname like '%n%'
or ur.fname like '%n%')
and a.status='active';

它可以正常工作并提供所需的结果。 在 hql 我不知道如何给额外的参数加入 用于获取我写的数据(没有额外的参数)

feeds = (List<Atom>) session.createQuery(
             "select distinct atom from Atom as atom "
             + "left join fetch atom.albums  as album "
             + "left join fetch album.postImageses as coverImage "
             + "left join fetch atom.user as user "
             + "where "
             +  "(atom.user.fname like :name "
             + "or atom.user.lname like :name )"
              + "and album.name=:albumName "
             + "and coverImage.isAlbumCover=:isCover "
             + "and atom.status=:status ")
             .setParameter("albumName", "Profile")
             .setParameter("name", '%' + name + '%')
            .setParameter("name", '%' + name + '%')
             .setParameter("isCover", "yes")
             .setParameter("status", "active")
             .setFirstResult(0)
             .setMaxResults(30)
             .list();

这没有给出任何结果,我怎样才能给加入额外的参数

【问题讨论】:

  • 您可以打印出生成的 SQL 并将其与您的工作 SQL 进行比较。顺便说一句,在 SQL 中你有 a.status='active',但在 hql 中你使用 setParameter("status", "Active")(首字母大写)。会不会是个问题?
  • 与isCover 相同(yes 和Yes)
  • 我改了问题`setParameter("status", "active")'

标签: mysql select join hql


【解决方案1】:

在 HQL 中,您可以使用 HQL with 关键字提供额外的连接条件。

切赫Associations and joins in HQL

试试这个:

您的HQL::

select distinct atom 
from Atom as atom 
left join atom.albums as album with album.name= "Profile" 
left join atom.postImageses as coverImage with coverImage.isAlbumCover="yes"
left join atom.user as user 
where (user.fname like name or user.lname like name) and atom.status="active";

您的代码::

feeds = (List<Atom>) session.createQuery(
               "select distinct atom from Atom as atom "
             + "left join atom.albums as album with album.name=:albumName "
             + "left join atom.postImageses as coverImage with coverImage.isAlbumCover=:isCover "
             + "left join atom.user as user "
             + "where (user.fname like :name or user.lname like :name) "
             + "and atom.status=:status ")
             .setParameter("albumName", "Profile")
             .setParameter("name", '%' + name + '%')
             .setParameter("isCover", "yes")
             .setParameter("status", "active")
             .setFirstResult(0)
             .setMaxResults(30)
             .list();

【讨论】:

  • 显示Exception in thread "main" org.hibernate.hql.ast.QuerySyntaxException: with-clause not allowed on fetched associations; use filters
  • 代码正在运行,但没有给出适当的结果。我只想要个人相册的封面图片。
  • @xrcwrn 此查询将给出与 SQL 给出的结果相同的结果,如果您希望有所不同,然后添加具有所需结果的示例输入数据以了解确切的问题
  • System.out.println(s.getSmallPicPath() + " " + s.getIsAlbumCover() + " " + s.getAlbum().getName() + " " + a.getId() ); \n 下面是 5 个操作 /img/post/small/8443098mubd4cp0e_1_yqf2vq5ns0141829_sm.jpg null Post 1 /img/post/small/0167466nvf535um2_1_bnmhihs6ux141829_sm.jpg null Post 1 /img/post/small/590235zttz3appmr_1_2clcp2e7oj141829_sm.jpg null Post 1 /img/post/small/732601ifkn7wod4r_1_p3tm1m2tta141931_sm.jpg null Post 1 /img/post/small/97237653xlptrp64_1_yeh6npsjj0141949_sm.JPG null Post 1
  • @xrcwrn 请为此添加 sql fiddle 演示,以便我找到确切的问题并为您提供解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多