针对ManyToMany关系的Hibernate查询

时间:2015-04-23 11:02:50

标签: java hibernate

一点免责声明:

  • 我在Java初学者级别
  • 我是hibernate的初级水平

好的,既然我们已经解决了这个问题,我的问题如下:

我的EmailAddressModel具有以下到EmailAddressTag的映射

private String id;
@Column(unique = true)
private String emailAddressName;

@ManyToMany(fetch = FetchType.EAGER)
private Set<EmailAddressTag> emailAddressTags = new HashSet<EmailAddressTag>();

和我的EmailAddressTag是:

private String id;    
@Column(unique = true)
private String emailAddressTags;

样本数据集:

id: 1
emailAddressName: abc@gmail.com
tags (id=1,emailAddressTags=tag1)

如何使用HQL构建查询以获取知道标记(整个对象)的电子邮件地址。 像

这样的东西
select * from EmailAddressTable where EmailAddressTable.Tag = 'tag1'

我试过了:

Set<EmailAddressTag> listOfTags = new HashSet<EmailAddressTag>();
listOfTags.add(tagToSearch);
Query query = session.createQuery("FROM EmailAddressTable item WHERE item.Tag IN (:tags)");
query.setParameterList("tags", listOfTags)

但是,如果使用setParameterList,我有错误(java错误)

  

无法投射... EmailAddressTag到java.util.Collection

如果使用setParameter,我有错误(休眠错误)

  

格式错误的数字常量:。

我将真正感谢任何帮助。真的迷失在这里。

2 个答案:

答案 0 :(得分:1)

如果您实际使用listOfTags变量的集合,则应该能够修复编译器错误。您没有显示该部分代码,但它看起来像这样:

Set<EmailAddressTag> listOfTags = new HashSet<EmailAddressTag>();
listOfTags.add(tagToSearchFor);
...
query.setParameterList("tags", listOfTags);

如果您想使用setParameter(),那么您应该能够修复hibernate错误,如果您将查询条件更改为仅检查单个标记:

Query query = session.createQuery("FROM EmailAddressTable item WHERE item.Tag = :tag");
query.setParameter("tag", tagToSearchFor)

希望这有帮助。

答案 1 :(得分:0)

我找到了答案。 其内容如下。

运算符是AND或OR

String hql = String.format("FROM %s obj where 1=1 ",c.getSimpleName());
for (int i = 0; i < tempList.size(); i++) {
    hql += " "+operator+" :collection" + i + " = some elements(obj.emailAddressTags)";
}

Query query = session.createQuery(hql);
for (int i = 0; i < tempList.size(); i++) {
    query.setParameter("collection" + i, tempList.get(i));
}
list = query.list();