一点免责声明:
好的,既然我们已经解决了这个问题,我的问题如下:
我的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,我有错误(休眠错误)
格式错误的数字常量:。
我将真正感谢任何帮助。真的迷失在这里。
答案 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();