0

JPAでcreateQueryを介して結合クエリを使用しています。MasterScripOrderMasterの2 つのテーブルがあります。エンティティ コードを以下に示します。動的クエリはコレクション オブジェクトを返します。デバッグしたところ、クエリが実行され、コレクション オブジェクトが正しく返されることがわかりました。しかし、以下に示すように、オブジェクトがエラーを返した後:

   [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;
    }
}

このエラーの原因は何ですか? どうすれば解決できますか?

4

1 に答える 1

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たとえばユーザー名の場合の単に不適切なクエリを防ぐことができます。

クエリは 2 つの異なる列を返します。そのようなクエリが魔法のように のインスタンスを返す方法はありませんMasterScripList<Object[]>それぞれにと のObject[]2 つの値が含まれる a を返します。scripSymbolscripID

クエリは、MasterScrip のインスタンスを返します。

select distinct s from MasterScrip s, OrderStock o 
where o.scripID.scripID = s.scripID and o.userName.userName = :userName
于 2012-05-29T11:14:10.403 に答える