【问题标题】:JPQL Many to Many conditional queryJPQL 多对多条件查询
【发布时间】:2012-06-08 01:46:17
【问题描述】:

我有两个实体:新闻和具有多对多关系的标签。新闻有一个日历字段。我有一些带有一些标签 ID 和日历的 long 数组。我想从 ids 数组中获取至少具有一个标签的所有新闻,并且只获取那些具有比我拥有的日历更新的日历的新闻。实现它的最佳方法是什么?提前致谢。

【问题讨论】:

  • 将 tagIds 类型更改为 List,您将其作为参数传递。

标签: hibernate jpa jpa-2.0 jpql


【解决方案1】:
select n from News n inner join n.tags tag
where tag.id in (:tagIds)
and n.theCalendarField > :calendarParam

【讨论】:

  • 我认为 in 是一个错字,应该是 id。即使,我得到以下异常:遇到数组值参数绑定,但期待 [java.lang.Long]
  • 是的,这是一个错字。我认为,您得到的异常是由 Hibernate 错误引起的。将in :tagIds 替换为in (:tagIds)
  • 还是错了。哦,天哪,我太愚蠢了,我传递的是字符串而不是多头。我会在一分钟内检查它。
  • 也许您可以详细说明一下。我看不懂你的屏幕。你得到什么例外?它做错了什么?错误消息旨在被阅读,并提供有用的信息。 “某事是错误的”根本没有帮助。
  • 抱歉不具体。还是以前的错误,检查我的编辑。
【解决方案2】:

您没有显示的是tagIds 的类型。根据预期的消息,它是数组。因为您要与 Long 进行比较,所以参数的类型应该是以下之一:long、Long 或 List<Long>

【讨论】:

  • 谢谢伙计,做到了。但是,如果我有例如我的列表中有 7 个标签,我得到了具有 7 个相同实体的新闻列表。我添加了 DISTINCT,它成功了,但不知道为什么会这样。
【解决方案3】:

JB Nizet 和 Mikko Maunu 的综合答案:

SELECT DISTINCT n FROM News n INNER JOIN n.tags t
WHERE t.id IN (:tagIds) AND n.timestamp > :timestamp

需要传递List,数组不行。

【讨论】:

    猜你喜欢
    • 2013-09-06
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 2011-07-29
    • 2020-03-26
    • 2013-06-22
    相关资源
    最近更新 更多