两个对象
public class Manager {
    private Integer id;  //管理员ID号
    private String name;   //管理员名称
    private String pwd;  //管理员密码
    private Purview purview;
    省略set和get方法
}public class Purview {
    private Integer id;
    private int sysset=0;  //系统设置权限
    private int readerset=0;   //读者管理权限
    private int bookset=0;   //图书管理权限
    private int borrowback=0;   //图书借还权限
    private int sysquery=0;    //系统查询权限
    private Manager manager;
    省略set和get方法}方法query_p
public Manager query_p(String str) {
        String hql = "select m.*,p.sysset,p.readerset,p.bookset,p.borrowback,p.sysquery from Manager m 
                      left join Purview p on m.id=p.id where m.name='"+str+"'";
        Manager manager1 = (Manager)this.getHibernateTemplate().find(hql).get(0);
        return manager1;
    }
我写这个方法返回Manager类型,但是不对
问:应该怎么写,才能实现联合查询返回Manager,Manager类里的purview也要有值。

解决方案 »

  1.   

    换个写法嘛
    public Manager query_p(String str) {
    String hql="from Manager where name="+str;
     Manager manager = (Manager)this.getHibernateTemplate().find(hql).get(0);
     manager1.getPurview();
     return manager;
    }
    红色的地方我没有判断,应该判断是不是为空和size是不是>0
      

  2.   

    在写manager1.getPurview();的时候hibernate又会发出一条sql语句,比且查询出来会调用manager1.setPurview();方法
      

  3.   

    Manager要和Purview做映射关联。
    也就是Manager的po里面要有Purview的属性。看是一对一还是一对多或是多对多,反正要有Purview。
    Manager的映射文件里也要有Purview关联。然后在hql时直接这样写:
    from Manager m join fetch  m.purview p where m.name='"+str+"'";
    这里的m.purview说是你Manager里的属性purview 或是purviews
      

  4.   

    不行啊,Manager manager = (Manager)this.getHibernateTemplate().find(hql).get(0);
    这句话根本运行不过去,我配置的是一对一主键映射
      

  5.   

    我在manager1 = (Manager)this.getHibernateTemplate().find(hql).get(0);后面加下面这个输出
    System.out.println("_________________");
    但是没有输出
      

  6.   

    有错误信息,我没设断点
    Hibernate: select manager0_.id as id6_, manager0_.name as name6_, manager0_.pwd as pwd6_ from h_manager manager0_ where manager0_.name='admin'
    Hibernate: select purview0_.id as id9_0_, purview0_.sysset as sysset9_0_, purview0_.readerset as readerset9_0_, purview0_.bookset as bookset9_0_, purview0_.borrowback as borrowback9_0_, purview0_.sysquery as sysquery9_0_ from h_purview purview0_ where purview0_.id=?
    hql=from Manager m join fetch m.purview p where m.id=1
    2012-3-25 21:34:59 org.apache.catalina.core.ApplicationDispatcher invoke
    严重: Servlet.service() for servlet jsp threw exception
    java.lang.NullPointerException
    at net.dbet.booksystem.dao.ManagerDAO.query_p(ManagerDAO.java:85)
    at org.apache.jsp.main_jsp._jspService(main_jsp.java:129)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
      

  7.   

    配置文件是这样的
    Purview.hbm.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
    <hibernate-mapping>
        <class name="net.dbet.booksystem.vo.Purview" table="h_purview">
            <id name="id">
                <generator class="foreign">
                    <param name="property">manager</param>
                </generator>
            </id>
            <property name="sysset"/>
            <property name="readerset"/>
            <property name="bookset"/>
            <property name="borrowback"/>
            <property name="sysquery"/>
            <one-to-one name="manager" constrained="true"/>
        </class>
    </hibernate-mapping>
      

  8.   

    Manager.hbm.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
    <hibernate-mapping>
        <class name="net.dbet.booksystem.vo.Manager" table="h_manager">
            <id name="id">
                <generator class="native"/>
            </id>
            <property name="name"/>
            <property name="pwd"/>
            <one-to-one name="purview" fetch="join"/>
        </class>
    </hibernate-mapping>
      

  9.   

    java.lang.NullPointerException
    at net.dbet.booksystem.dao.ManagerDAO.query_p(ManagerDAO.java:85)出现空指针了。是不是根据这样的条件没查出值出来,然后你直接get(0)时出现的空指针?你这样写:
    List<Manager> managerList = this.getHibernateTemplate().find(hql);然后 Manager manager1 = managerList.get(0);
      

  10.   

    你确定
    public Manager query_p(String str) {
    String hql="from Manager where name=?";
    Manager manager = (Manager)this.getHibernateTemplate().find(hql,str).get(0);
    manager1.getPurview();
    return manager;
    }
    这样写也是空异常?
      

  11.   

    如果这样写还是为空,那你就去检查HibernateTemplate有没有注入进来
      

  12.   

    List<Manager> managerList = this.getHibernateTemplate().find(hql);
    Manager manager = managerList.get(0);
    这样写还是一样的错误啊
      

  13.   

    我确定
    public Manager query_p(String str) {
    String hql="from Manager where name=?";
    Manager manager = (Manager)this.getHibernateTemplate().find(hql,str).get(0);
    manager1.getPurview();
    return manager;
    }
    这样写也是空异常那个HibernateTemplate注入进来了
    其他语句有正确运行了啊
      

  14.   


    1、确定dataSource已经成功注入
    2、确定dao成功被注入
    3、Manager manager = (Manager)this.getHibernateTemplate().find(hql).get(0);你这样直接写,强制转换,如果没有数据,明显会报转换错误或者空指针。
      

  15.   

    List<Manager> managerList = this.getHibernateTemplate().find(hql);这行产生的
      

  16.   

    会报空异常只有可能是HibernateTemplate没有注入进来
      

  17.   

    我测试过this.getHibernateTemplate().find(hql).get(0)如果没有查询到数据报的是IndexOutOfBoundsException,没得说,肯定HibernateTemplate没有注入进来
      

  18.   

    哦,我是新手,没有任何经验,还没毕业呢
    HibernateTemplate怎么注入啊?
    我是整合ssh框架
      

  19.   

    楼主看看当前类的配置文件的bean里有没有注入sessionFactory?
      

  20.   

    你的ManagerDAO,里面加的是sessionFactory还是hibernateTemplate?
    如果是hibernateTemplate:
    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory" />
    </bean><bean id="managerDAO" class="net.dbet.booksystem.dao.ManagerDAO">
    <property name="hibernateTemplate" ref="hibernateTemplate" />
    </bean>sessionFactory同理,记得写set方法
      

  21.   

    如果你是继承的HibernateDaoSupport
    就需要<bean id="managerDAO" class="net.dbet.booksystem.dao.ManagerDAO">
    <property name="sessionFactory" ref="sessionFactory" />
    </bean>
      

  22.   

    我是这样配置的
    <!-- 配置sessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
    </bean>           

    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref bean="sessionFactory"/>
        </property>
    </bean>

    <!-- 配置事务的传播特性 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="search*" propagation="SUPPORTS"/>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

    <!-- 那些类的哪些方法参与事务 -->
    <aop:config>
        <aop:pointcut expression="execution(* net.dbet.booksystem.*.*(..))" id="cut"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="cut"/>
    </aop:config>
      

  23.   

    <bean id="managerAction" class="net.dbet.booksystem.action.ManagerAction">
    <property name="managerDAO" ref="managerDAO"/>
    </bean>

    <bean id="managerDAO" class="net.dbet.booksystem.dao.ManagerDAO">
    <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
      

  24.   

    感觉是你的sessionFactory没有注入进来。
      

  25.   

    不过之前这里写错了
    <!-- 那些类的哪些方法参与事务 -->
    <aop:config>
    <aop:pointcut expression="execution(* net.dbet.booksystem.*.*(..))" id="cut"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="cut"/>
    </aop:config>
    现在改过来了  控制台没错误,但是页面出错了,在方法里没有输出
    我第一次整合ssh框架,哎
      

  26.   

    请问
    <bean id="managerAction" class="net.dbet.booksystem.action.ManagerAction">
    <property name="managerDAO" ref="managerDAO"/>
    </bean>
    这里要把manager(managerAction里的private Manager manager)注入进去吗?
      

  27.   

    private Manager manager是指从页面接收值吧?
    要写getter/setter。Manager是po,不用注入的。
      

  28.   

    对了  因为是登陆跳转页面,是不是我在jsp页面里调用该方法出现的问题??怎么解决呢?