我有一个Person类,该类具有别名的String集合,这些别名表示person可能通过的其他名称。例如,克拉克·肯特(Clark Kent)可能有别名“超人”和“钢铁侠”。德怀特·霍华德(Dwight Howard)的别名为“超人”。
@Entity class Person { @CollectionOfElements(fetch=FetchType.EAGER) Set<String> aliases = new TreeSet<String>();
Hibernate在我的数据库中创建了两个表Person和Person_aliases。Person_aliases是具有Person_id和element列的联接表。假设Person_aliases具有以下数据
-------------------------------- | Person_id | element | -------------------------------- | Clark Kent | Superman | | Clark Kent | Man of Steel | | Dwight Howard | Superman | | Bruce Wayne | Batman | --------------------------------
我想对所有别名为“超人”的人进行hibernate标准查询。
由于此处列出的时间太长,我真的想将此作为Criteria查询,而不是HQL查询(除非可以在Criteria对象上添加HQL限制,在这种情况下,我全神贯注)SQL查询。自从根据我如何使用hibernate条件在String集合中查询具有值的对象以来?使用CriteriaAPI引用值类型集合的元素是不可能的,我认为我想在我的条件对象上添加SqlRestriction。
Criteria crit = session.createCriteria(Person.class); crit.add(Restrictions.sqlRestriction("XXXXX.element='superman'");
希望Hibernate将创建一个SQL语句,例如
select * from Person this_ left outer join Person_aliases aliases2_ on this_.id=aliases2_.Person_id where XXXXX.element='superman'
但是,我需要在SQL查询中用Person_aliases表的表别名填写XXXXX,在这种情况下为’aliases2_’。我注意到,如果需要引用Person表别名,则可以使用{alias}。但这是行不通的,因为Person是此条件的主表,而不是Person_aliases。
我要为XXXXX填写什么?如果没有像{alias}这样好的替代令牌,那么有什么办法可以让我hibernate以告诉我该别名将是什么?我注意到一个称为generateAlias()org.hibernate.util.StringHelper类的方法。这能帮助我预测别名是什么吗?
我真的非常希望避免硬编码“ aliases2_”。
谢谢你的时间!
似乎Criteria API不允许查询元素的集合,请参阅HHH-869(仍处于打开状态)。因此,要么尝试建议的解决方法(我没有),要么切换到HQL。以下HQL查询将起作用:
from Person p where :alias in elements(p.aliases)