如果我只从单个表的一列汇集两种不同类型的值,如何使用JPA映射/注释。

时间:2012-07-03 16:17:44

标签: java jpa

我有3张桌子。 LOV,SYS和规则。使用@Model将Sys表映射到我的应用程序中的一个编辑器的View Controller。现在在编辑器中我必须显示3列

  1. App ID
  2. 错误消息
  3. 更正消息
  4. 在sys表中有一列Char_value,它包含AppID,还有错误消息。 在Lov表中,有一个名为选项值的列,它包含更正消息。 所以我写了以下查询来提取数据

    Query qAppId = em.createQuery("select osc from OscaSysControl osc "+
                        " where osc.oscaControlRule.categoryName ='PROBLEM LOG' and osc.oscaControlRule.controlName = 'APPLICATION ID'");
    
    
    Query ErrCorr= em.createQuery("select osc from OscaSysControl osc join osc.oscaControlRule oscr " +
                        "left outer join osc.oscaControlLov lov " + 
                        "where oscr.controlName = 'ERROR MESSAGE' and oscr.categoryName = 'PROBLEM LOG' " +
                        "and oscr.processName = :processName");
    

    我将sys表的对象作为OSC,因为它与VC映射,因此必须拥有OSC中的所有内容。同样在第二个查询中我试图在同一结果集中获取错误和corr消息。将进程名称作为参数传递。

    res和res2是SYS的类型

    res = qAppId.getResultList();
    

    以下for循环是将参数传递给第二个查询。但它给人的错误" SYS和String不兼容"

    List<String> appID = new ArrayList<String>(); 
    for (OscaSysControl o : res) { 
        appID.add((String)o.getAppId()); // explain ?
    }
    
    int appIDLength = appID.size();
    for (int i=0; i<appIDLength; i++){
        q2.setParameter("processName",appID.get(i));
        q2.setParameter("processName", res.get(i).getOscaControlRule().getProcessName());
        res2 = q2.getResultList();
        resultErrCorr.add((OscaSysControl) res2); 
    }
    

    您是否可以建议我如何进行制图,注意这项工作。

1 个答案:

答案 0 :(得分:0)

如果你正在使用EclipseLink JPA实现 - 有一个@Convert - 注释,也许会有所帮助。有一个类似的复杂问题,其中列由列名和位值连接,转换器工作得很好。

如何使用转换器,请参阅: http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_(ELUG)#Using_EclipseLink_JPA_Converters