【问题标题】:Dynamic JPA query not working动态 JPA 查询不起作用
【发布时间】:2012-05-29 10:36:57
【问题描述】:

我在 JPA 中通过 createQuery 使用连接查询。我有 2 个表 MasterScripOrderMaster。实体代码如下。动态查询正在返回集合对象。我调试了一下,发现查询执行正确,返回集合对象;但是,对象返回错误后,如下图:

   [javax.xml.bind.JAXBException: class [Ljava.lang.Object; nor any of its super class is known to this context.]
    javax.xml.ws.WebServiceException: javax.xml.bind.MarshalException...

    SEVERE: Error Rendering View[/ClientTemplate/orderReport.xhtml]
    javax.el.ELException: /ClientTemplate/orderReport.xhtml @14,142 value="#{stockOrderBean.scripLst}": com.sun.xml.ws.streaming.XMLStreamReaderException: unexpected XML tag. expected: {http://service/}getOrderScripByUserNameResponse but found: {http://schemas.xmlsoap.org/soap/envelope/}Envelope
        at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114)

无状态bean方法:

 public Collection<MasterScrip> getOrderScripByUserName(String userName)
{        
    try
    {
        String squery = "select DISTINCT(s.scripSymbol),s.scripID from MasterScrip s,OrderStock o where o.scripID.scripID = s.scripID and o.userName.userName = '" + userName + "'";
        Collection<MasterScrip> c = em.createQuery(squery).getResultList();
        //UserMaster um = em.find(UserMaster.class,userName);
        return c;
    } catch(Exception e) {
        System.out.println(e);
        return null;
    }
}

这个错误的原因是什么?我该如何解决?

【问题讨论】:

  • 从参数构造查询是个坏主意。改用参数。了解这个名为“SQL 注入”的问题
  • 但我猜查询工作正常,因为它正在返回所需的结果
  • 你建议我使用 setParameter 吗?
  • 是的 setParameter 是安全的东西

标签: java jpa


【解决方案1】:

首先,如 cmets 中所述,您应该始终使用参数而不是连接参数值:

select DISTINCT(s.scripSymbol), s.scripID from MasterScrip s, OrderStock o 
where o.scripID.scripID = s.scripID and o.userName.userName = :userName

这将防止 SQL 注入攻击,或者在使用 O'Reilly 之类的用户名时简单地进行错误查询。

您的查询返回两个不同的列。这样的查询无法神奇地返回MasterScrip 的实例。它返回一个List&lt;Object[]&gt;,其中每个Object[] 包含两个值:scripSymbolscripID

如果是,查询将返回 MasterScrip 的实例

select distinct s from MasterScrip s, OrderStock o 
where o.scripID.scripID = s.scripID and o.userName.userName = :userName

【讨论】:

    猜你喜欢
    • 2019-07-16
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2021-11-19
    • 2017-07-08
    • 2017-04-06
    • 2011-09-10
    相关资源
    最近更新 更多