我在JPA中通过createQuery使用连接查询。我有2个表 MasterScrip 和 OrderMaster 。实体代码如下。动态查询返回集合对象。我调试并发现查询执行并正确返回集合对象;但是,在对象返回错误后,如下所示:
[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;
}
}
此错误的原因是什么?我该如何解决?
答案 0 :(得分:1)
首先,如评论中所述,您应始终使用参数而不是连接参数值:
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<Object[]>
,其中每个Object[]
包含两个值:scripSymbol
和scripID
。
如果是
,则查询将返回MasterScrip的实例select distinct s from MasterScrip s, OrderStock o
where o.scripID.scripID = s.scripID and o.userName.userName = :userName