【问题标题】:How to select and display custom result?如何选择和显示自定义结果?
【发布时间】:2015-01-02 03:22:41
【问题描述】:

下面是hibernate.reveng.xml中的映射表列表:

  <table-filter match-name="UNI_MAJORS"/>
  <table-filter match-name="SKILLS"/>
  <table-filter match-name="PROFILES_JOB_EXPERIENCES"/>
  <table-filter match-name="PROFILES_EDU"/>
  <table-filter match-name="PROFILES_SKILLS"/>
  <table-filter match-name="UNI_DEGREES"/>
  <table-filter match-name="HIGHER_EDU_CENTERS"/>
  <table-filter match-name="COMPANIES"/>
  <table-filter match-name="PROFILES"/>
  <table-filter match-name="CITIES"/>
  <table-filter match-name="STATES"/>

我使用的是 *.hbm.xml 文件,而不是注释。 每件事都正常工作我只想显示如下所示的结果,该结果不在上述映射类中:

select p.profile_id,pj.exp_id,p.full_name,ct.city_name
 ,c.company_name,pj.title,pj.date_from,pj.date_to
from PROFILES p
join PROFILES_JOB_EXPERIENCES pj on p.profile_id=pj.profile_ref
left outer join COMPANIES c on pj.company_ref=c.company_id
left outer join CITIES ct on ct.city_id=c.city_ref

我在控制器类中尝试了以下方法:

    @ManagedBean
    @ViewScoped
    public class ProfileExperiences implements Serializable {
      //code...(not need for display here)

      public List getExpList() {
      session = sessionFactory.openSession();
      transaction = session.beginTransaction();
      List<ProfileExpsView> lst = session.createQuery("Select p.profileId as profileId, pj.expId as expId,"
            + "p.fullName as fullName, cmp.cities.cityName as cityName,cmp.companyName as companyName,"
            + "pj.title as title,pj.dateFrom as dateFrom,pj.dateTo as dateTo "
            + "From Profiles p "
            + "join p.profilesJobExperienceses pj "
            + "join pj.companies cmp "
            + "where p.profileId=:p_profileId").setParameter("p_profileId",
            profiles.getProfileId()).list();
    transaction.commit();
    session.close();
    return lst;
    }
    //Code...(not need for display here)
  }

在我的 JSF 页面中,我使用了这个:

<h:panelGrid>
            <h:dataTable id="expsList" value="#{profileExperiences.expList}" var="exp">
                <h:column>
                    <f:facet name="header">City</f:facet>
                    #{exp.cityName}
                </h:column>
                <h:column>
                    <f:facet name="hearde">Company</f:facet>
                    #{exp.companyName}
                </h:column>
                <h:column>
                    <f:facet name="header">Job Title</f:facet>
                    #{exp.title}
                </h:column>
                <h:column>
                    <f:facet name="header">Start Date</f:facet>
                    #{exp.dateFrom}
                </h:column>
                <h:column>
                    <f:facet name="header">End date</f:facet>
                    #{exp.dateTo}
                </h:column>
                <h:column>
                    <h:commandButton value="X" action="#{profileExperiences.deleteProExp(exp.expId)}">
                        <f:ajax execute="@form" render="@form"></f:ajax>
                    </h:commandButton>
                </h:column>
            </h:dataTable>
        </h:panelGrid>

但是什么都没有显示,是什么问题?

【问题讨论】:

  • 这个问题显然与 Hibernate 相关(和/或相关的后端数据库,如果查询语句以任何一种方式失败)。在这种情况下,JSF 纯粹是一个多余的主题。您正在从方法 getExpList() 返回一个非泛型 java.util.List。如果您要返回一个元组行列表(因此不是一个完全限定的映射实体的对象列表),那么有几种方法可以做到这一点。简而言之,您可以返回List&lt;Object[]&gt;List&lt;Tuple&gt;,或者您可以使用构造函数查询将结果列表映射到一类对象,从而返回List&lt;YourClass&gt;
  • @Tiny 感谢您的评论,List&lt;Object[]&gt; 也没有将结果带入我的 jsf 页面我不知道到底是什么问题,我会尝试List&lt;YourClass&gt; 如下答案我认为如果我需要不同的页面和控制器类会更好。
  • 好吧,我提到了那些纯粹基于 JPA 的结果列表策略 List&lt;Object[]&gt;List&lt;Tuple&gt;List&lt;YourClass&gt;。在纯核心原生 Hibernate 的上下文中,情况可能会有所不同。
  • @BalusC 非常感谢您的编辑和评论,我是新人,下次我会尝试,但是问题得到了解决。

标签: hibernate jsf plsql


【解决方案1】:

您可以返回列表并使用索引引用对象

 List<Object[]> lst = session.createQuery("Select cmp.cities.cityName as cityName,cmp.companyName as companyName,"
        + "pj.title as title,pj.dateFrom as dateFrom,pj.dateTo as dateTo "
        + "From Profiles p "
        + "join p.profilesJobExperienceses pj "
        + "join pj.companies cmp "
        + "where p.profileId=:p_profileId").setParameter("p_profileId",
        profiles.getProfileId()).list();

在 JSF 页面中,您可以参考 #{item[0]} Refer here

<h:panelGrid>
        <h:dataTable id="expsList" value="#{profileExperiences.expList}" var="exp">
            <h:column>
                <f:facet name="header">City</f:facet>
                #{exp[0]}
            </h:column>
            <h:column>
                <f:facet name="hearde">Company</f:facet>
                 #{exp[1]}
            </h:column>
            <h:column>
                <f:facet name="header">Job Title</f:facet>
                #{exp[2]}
            </h:column>
            <h:column>
                <f:facet name="header">Start Date</f:facet>
                #{exp[3]}
            </h:column>
            <h:column>
                <f:facet name="header">End date</f:facet>
                #{exp[4]}
            </h:column>
            <h:column>
                <h:commandButton value="X" action="#{profileExperiences.deleteProExp(exp.expId)}">
                    <f:ajax execute="@form" render="@form"></f:ajax>
                </h:commandButton>
            </h:column>
        </h:dataTable>
    </h:panelGrid>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多