Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在hibernate中将@Loader与位置参数一起使用?_Java_Database_Spring_Hibernate_Orm - Fatal编程技术网

Java 如何在hibernate中将@Loader与位置参数一起使用?

Java 如何在hibernate中将@Loader与位置参数一起使用?,java,database,spring,hibernate,orm,Java,Database,Spring,Hibernate,Orm,我正在尝试使用@Loader注释通过使用hibernate的查询填充集合 假设我有一个包含子菜单列表的菜单类。我希望这些子菜单使用@NamedNativeQuery填充 问题是,当我在查询中放置位置参数时,我不知道如何在运行时设置它的值 这是我的菜单课。当我获取菜单时,所有子菜单都为空。我应该在哪里设置位置参数值?你能帮忙吗 这是我的XML <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mappin

我正在尝试使用@Loader注释通过使用hibernate的查询填充集合

假设我有一个包含子菜单列表的菜单类。我希望这些子菜单使用@NamedNativeQuery填充

问题是,当我在查询中放置位置参数时,我不知道如何在运行时设置它的值

这是我的菜单课。当我获取菜单时,所有子菜单都为空。我应该在哪里设置位置参数值?你能帮忙吗

这是我的XML

    <!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文件中有问题。看看我的答案中添加的链接。我已经更新了我的答案。