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的菜单。 我该怎么办?
感谢。
答案 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)