Hibernate(HQL) - 如何从多个表中查找唯一的查询?

时间:2011-11-02 10:10:20

标签: hibernate hql

public class Menu { 
  private int menuId; 
  private String name;
  private Set<Item> items=new HashSet<Item>(); 

} 
public class Item { 
  private int itemId; 
  private String name; 
  private Set<Menu> menus=new HashSet<Menu>();
}

菜单的xml:

<class name="Menu" table="menu">
    <id name="menuId" type="java.lang.Integer" column="menuId">
        <generator class="increment"></generator>
    </id>
    <property name="name" type="string" column="menuName" length="100"></property>
    <set access="property" lazy="true" inverse="false" cascade="save-update"
        name="items" batch-size="10" fetch="select" table="menu_item">
        <key column="menuId" />
        <many-to-many class="Item" column="itemId" />
    </set>

项目的xml:

<class name="Item" table="item">
    <id name="itemId" type="java.lang.Integer" column="itemId">
        <generator class="increment"></generator>
    </id>
    <property name="name" type="string" column="itemName" length="100"></property>
    <set access="property" lazy="true" inverse="false" cascade="save-update"
        name="menus" batch-size="10" fetch="select" table="menu_item">
        <key column="itemId" />
        <many-to-many class="Menu" column="menuId" />
    </set>
</class>

问题1: 我想找到项目'itemIds不是1或2的菜单。 例如,一个菜单的项'itemIds是1,3,4。 我尝试像这样做hql:

select menu 
from Menu menu, In(menu.items) items 
where items.itemId not in (1,2)

但实际上它会找到这个菜单。

我该怎么做?

问题2: 我想找到项目的itemIds同时为1和2的菜单。 我尝试像这样做hql:

选择菜单 从菜单菜单,在(menu.items)项目 其中items.itemId in(1,2)

但实际上它会找到itemIds为1或2而不是1和2的菜单。 我该怎么办?

感谢。

2 个答案:

答案 0 :(得分:0)

如果可以接受,我建议你使用Criteria查询。以下是片段

DetachedCriteria dc = DetachedCriteria.forClass(Menu.class);
List<Menu> list = new ArrayList<Menu>();
dc.createAlias("items","item");
dc.add(Restrictions.and(
     Restrictions.ne("item.itemId",1),
               Restrictions.ne("item.itemId",2)));
list = hibernateTemplate.findByCriteria(dc);

这将为您提供ItemId不等于1和2的所有菜单。

也可以对其他问题使用类似的查询。希望这可以帮到你。 顺便说一下,我还没有测试过这个解决方案。

答案 1 :(得分:0)

我自己找到了 1.菜单菜单,其中2 =(从菜单菜单中选择计数(menu.id),在(menu.items)项目中的项目.itemId在(1,2)) 2.从菜单菜单2中选择menu2,其中3 =(从菜单菜单中选择计数(menu.id),在(menu.items)中的项目,其中items.itemId在(1,2,3)和menu.menuId = menu2.menuId)