【问题标题】:hibernate one to many query休眠一对多查询
【发布时间】:2011-08-09 20:40:25
【问题描述】:

我有以下具有一对多关系的类表

 @Entity 
 public class People{ 
     @Id @Column private Integer id;
     @Column(name="FNAME")  private String fName;   
     @Column(name="LNAME")  private String lName;   
     @OnetoMany(targetEntity=Registration.class, mappedBy="pId", cascade.....)  
     private Set<Registrations> registrations;   
     //getters and setters 
  } 

活动

  @Entity
  public class Events{
     @Id @Column private Integer id;   
     @Column(name="NAME")  private String name;
     @Column(name="DATE")  private Timestamp date;
    @OnetoMany(targetEntity=Registration.class, mappedBy="eId", cascade.....)  
    private Set<Registrations> registrations;   
    //getters and setters 
  }

注册

  @Entity
  public class Registrations{
     @Id @Column private Integer id;   
     @Manytoone @JoinColumn(name="pid" ) private Person person;
     @Manytoone @JoinColumn(name="eid" ) private Event event;
  //getters and setters 
  }

所以在用户输入“事件ID”列表时的输入表单中,我需要返回参加这些事件的人员列表。如何为这种类型编写查询? 到目前为止我有这个..

from Person p join p.registations r where r.event.id in (:eventIdlist)"

但我认为它同时返回人员和重新定义对象。因为当我执行此 List person = query.list() 时,我得到了无法转换的错误。我只需要人员对象列表。

【问题讨论】:

  • 告诉我们确切的错误信息是什么,并展示使用引发此异常的代码。此外,您的映射是错误的:mappedBy="eId" 应该替换为 mappedBy="event",mappedBy="pId" 应该替换为 mappedBy="person"。

标签: hibernate one-to-many


【解决方案1】:
select distinct r.person from Registration r where r.event.id in (:eventIdList)

【讨论】:

  • 不,这个不正确。您不能在代表集合的 p.registrations 上使用 .event。你必须像 OP 一样加入它。
  • @JB.. 是的,我之前已经尝试过了,并且因为尝试实例化列表中的对象或某种错误而得到了非法参数例外
  • 再试一次,添加distinct。
【解决方案2】:

更简单:

select r.person from Registration r where r.event.id in (:eventIdList)

已编辑评论:要加入其他表格,您可以这样做:

select p
from Person p
where p.registration.event.id in (:eventIdList)
and p.peopleLanguage.language.id in (:languageIdList)

【讨论】:

  • @Bohemian/Gaetanz .. 感谢您的回复.. 我会在工作中尝试这个 tmrw .. 但我有一个疑问.. 我还有两张表有一对多关系.. 让说 Languages(Id, Name), PeopleLanguages(Id, PersonID, LanguageId).. 我可以使用类似于上面的查询来提取说语言列表的人的列表.. 但是我怎样才能结合这两个查询..我的意思是,如果我想要一份参加过某些活动会说某些语言的人的列表?
  • @Bohemian.. 不能使用 p.registrations.event.. 因为 p.registrations 是一个集合...类似 p.peoplelanguages..
猜你喜欢
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多