【问题标题】:Hibernate(HQL) - how to query "where many in()" many to manyHibernate(HQL) - 如何查询“where many in()”多对多
【发布时间】:2025-11-21 07:00:02
【问题描述】:


我有一个拥有许多汽车的用户实体。
我无法使用“IN”语句通过汽车列表获取用户。

List<Car> cars = getCarsList();
String hql = "From User WHERE user.cars in(:cars)";
Query query = session.createQuery(hql)
query.setParameterList("cars",cars);
//query.setParameterList("cars",cars.toArray());//not working also
//query.setParameter("cars","1,4,8,30");//not working also
query.setMaxResults(1);

这样,参数是被忽略的汽车。
我也尝试发送 vars.toArray();
而且我还尝试发送字符串 1,4,8,300(如果是汽车,则为 Ids)。

【问题讨论】:

    标签: hibernate many-to-many where-in


    【解决方案1】:

    未定义用户别名。试试

    String hql = "from User user inner join user.cars car where car.id in (:carIds)";
    Query query = session.createQuery(hql)
    query.setParameterList("cars", carIds);
    

    其中 carIds 是一个包含汽车 ID 的集合(而不是第三次尝试中的字符串)。

    【讨论】:

    • 谢谢,但是我想避免使用“Joins”,这不就是hibernate的全部意义吗?用户已经在获取汽车,因为它处于多对多关系中。
    • 顺便说一句,carIds 是指 List 还是 (0,5,100)?
    • 正如我所说,carIds 是一个包含汽车 ID 的集合(如在 java.util.Collection 中)。因此,如果 Integer 是 Car 实体的 ID 类型,则 List 是可以的(尽管在这种情况下 Set 更符合逻辑)。而获取与这个问题无关。联接是在 HQL 中的实体之间导航的适当方式。
    • 所以如果不是多对多我就不需要加入?正如我在您的主页上所说的那样。
    • 阅读docs.jboss.org/hibernate/core/3.3/reference/en/html/…。只要属性引用 XxxToOne 关联,您就可以链接属性:person.parent.name 可以,但 person.children.name 不行。