Java 如何在hibernate中将@Loader与位置参数一起使用?
我正在尝试使用@Loader注释通过使用hibernate的查询填充集合 假设我有一个包含子菜单列表的菜单类。我希望这些子菜单使用@NamedNativeQuery填充 问题是,当我在查询中放置位置参数时,我不知道如何在运行时设置它的值 这是我的菜单课。当我获取菜单时,所有子菜单都为空。我应该在哪里设置位置参数值?你能帮忙吗 这是我的XMLJava 如何在hibernate中将@Loader与位置参数一起使用?,java,database,spring,hibernate,orm,Java,Database,Spring,Hibernate,Orm,我正在尝试使用@Loader注释通过使用hibernate的查询填充集合 假设我有一个包含子菜单列表的菜单类。我希望这些子菜单使用@NamedNativeQuery填充 问题是,当我在查询中放置位置参数时,我不知道如何在运行时设置它的值 这是我的菜单课。当我获取菜单时,所有子菜单都为空。我应该在哪里设置位置参数值?你能帮忙吗 这是我的XML <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mappin
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<sql-query name="getMenus">
<load-collection alias="menu" role="com.pmc.domain.Menu.submenus" />
select
{menu.*}
from
Menu menu
join menu_roles mr on (mr.menu_item_id=menu.menu_item_id)
join roles r on (r.user_role_id=mr.user_role_id)
join user_roles ur on (ur.user_role_id=r.user_role_id)
join users u on (u.username = ur.username)
where
menu.parent = ? and u.username=?
</sql-query>
</hibernate-mapping>
如果我使用下面的代码
Query query = session.getNamedQuery("getMenus");
query=query.setParameter(0, 1);
query=query.setParameter(1, "jigar");
List<Menu> list = query.list();
Query Query=session.getNamedQuery(“getMenus”);
query=query.setParameter(0,1);
query=query.setParameter(1,“jigar”);
List=query.List();
它工作正常并返回正确的结果
但当我将其传递到@Loader for collection时,它找不到位置参数。但是,如果我使用单个位置参数,即?然后,它也在那里工作,因为子菜单由父菜单映射,并且它将父值作为位置参数。但对于进一步的位置参数,它不起作用。将代码从更改为
@Entity
@NamedNativeQuery(
name="submenus",
query="select * from menu where parent = ? ",
resultClass=Menu.class)
@Table(name="menu", catalog="test")
public class Menu implements Serializable{
@NamedNativeQueries({@NamedNativeQuery(
name="submenus",
query="select * from menu where parent = :parentName and menu_item_id = :menuItemId",
resultClass=Menu.class)
})
@Entity
@Table(name="menu", catalog="test")
public class Menu implements Serializable{
@OneToMany(mappedBy="parent",fetch = FetchType.LAZY)
@Loader(namedQuery = "submenus")
private List<Menu> submenus;
至
@Entity
@NamedNativeQuery(
name="submenus",
query="select * from menu where parent = ? ",
resultClass=Menu.class)
@Table(name="menu", catalog="test")
public class Menu implements Serializable{
@NamedNativeQueries({@NamedNativeQuery(
name="submenus",
query="select * from menu where parent = :parentName and menu_item_id = :menuItemId",
resultClass=Menu.class)
})
@Entity
@Table(name="menu", catalog="test")
public class Menu implements Serializable{
@OneToMany(mappedBy="parent",fetch = FetchType.LAZY)
@Loader(namedQuery = "submenus")
private List<Menu> submenus;
从中删除@Loader注释
@Entity
@NamedNativeQuery(
name="submenus",
query="select * from menu where parent = ? ",
resultClass=Menu.class)
@Table(name="menu", catalog="test")
public class Menu implements Serializable{
@NamedNativeQueries({@NamedNativeQuery(
name="submenus",
query="select * from menu where parent = :parentName and menu_item_id = :menuItemId",
resultClass=Menu.class)
})
@Entity
@Table(name="menu", catalog="test")
public class Menu implements Serializable{
@OneToMany(mappedBy="parent",fetch = FetchType.LAZY)
@Loader(namedQuery = "submenus")
private List<Menu> submenus;
Bcoz@Loader注释仅适用于类和集合,不适用于@OneToMany等关联
将命名的本机查询称为
@NamedNativeQueries({@NamedNativeQuery(
name="submenus",
query="select * from menu where parent = :parentName and menu_item_id = :menuItemId",
resultClass=Menu.class)
})
@Loader(namedQuery = "submenus")
@Entity
@Table(name="menu", catalog="test")
public class Menu implements Serializable{
Query query = session.getNamedQuery("submenus");
query.setParameter("parentName", "Whatever u want");
query.setParameter("menuItemId", "Whatever u want");
//or
//if ur query is like this
//select * from menu where parent = ? and menu_item_id = ?
query.setParameter(1, "Whatever u want");
query.setParameter(2, "Whatever u want");
也看看
我希望它能帮助您。命名查询支持多个参数,但
@Loader
只支持一个,其他查询参数不会被替换。不能在会话上全局设置参数(如在@Filter
的情况下),而只能在命名查询的每个实例上设置参数
当您从@Loader
使用@NamedQuery
或@NamedNativeQuery
时,您只能使用一个参数(无论其类型、位置/名称如何),该参数将替换为查询实体的可序列化的
id
if ( query.hasNamedParameters() ) {
query.setParameter( query.getNamedParameters()[0], id, persister.getIdentifierType() );
}
else {
query.setParameter( 0, id, persister.getIdentifierType() );
}
请参见您不能在@OneToMany映射上添加@Loader注释。它仅适用于类别和集合。看看我的答案。我希望它能解决你的问题。谢谢@OO7。这对我来说很清楚。。再补充一点,您能否解释一下,在存在多个位置参数的情况下,如何设置位置参数。i、 e.如果我的查询是这样的,请从菜单中选择*,其中parent=:parent\u Name和menu\u item\u id=?您可以调用
query.setParameter(“parent\u Name”,“任意您想要的”)代码>多次传递不同的参数。请参阅我的更新答案。再次感谢@OO7,在浏览了您提供的链接后,我已将sql查询移动到hibernate配置文件。现在,如果我使用静态参数,它将获取子菜单列表。但是当我使用位置参数或命名参数时,它不会使用dao中的query.setParameter来设置它。我猜当子菜单第一次被访问时会调用这个查询,因为它们是惰性加载的。那时,我们可以在哪里设置参数?在波乔?还是用刀?如何设置?如何在XML中设置命名或位置参数?你能用那个代码片段更新你的问题吗?好让我知道你到底在做什么?您是否尝试过使用注释?在XML映射中使用命名SQL查询
或本机SQL查询
?我认为您的XML文件中有问题。看看我的答案中添加的链接。我已经更新了我的答案。