0

を使用するアプリでメソッドを作成しているときに、フィールドplayframeworkのユーザー入力を取得Addressし、データベースで一致するものを検索する必要があります。一致するアドレスが見つからない場合は、新しいアドレスを作成する必要があります。

ここではaddressLine1とのみcountryが必須フィールドです。ユーザーは addressLine2 を無視できます。

HTMLフォームから入力を取得している間、オプションフィールドのテキストフィールドは空の文字列を返します。そのため、 Address の作成をテストするためMap<String,String>に、メソッドに渡されるを作成することにしましたPOST..

addrparams = new Map<String,String>();
addrparams.put("addressline1","clayton st");
addrparams.put("country","US");

これにより、jpql クエリが不足しているオプション フィールドのマップから値をバインドしようとしたときに、nullpointer 例外が発生しました。

String query="select distinct a from Address a where a.addressLine1=:addressline1 and a.addressLine2=:addressline2 and a.country=:country";
Address address = Address.find(query).bind("addressline1",addressline1).bind("addressline2",addressline2).bind("country", country).first();
            ..

すべてのオプションフィールドに空の文字列を入れることでこれを解決しました

addrparams = new Map<String,String>();
addrparams.put("addressline1","clayton st");
addrparams.put("addressline2","");
addrparams.put("country","US");

これがこれを行う正しい方法であることを願っています..誰かがそのような状況をテストする際のより良いアプローチを指摘できれば、それは私を大いに助けるでしょう.

Address クラス

@Entity
public class Address extends Model {    
    @Required
    String addressLine1;    
    String addressLine2;        
    @Required
    String country;
...
} 

更新: スタックトレースはこちら

nullptr 例外が発生する Account.java:207 は、この行です

Address address = Address.find(query).bind("addressline1",addressline1).bind("addressline2",addressline2).bind("country", country).first();
4

1 に答える 1

1

あなたのクエリは間違っています。where句にエイリアスと等号がありませんでした:

where a.addressline1 = :addressline1 ...

マップの作成方法も間違っています。「clayton st」を addressline1 として入力し、それを空の文字列に置き換えます。

これらの修正が機能しない場合は、質問を編集し、例外のスタック トレースを貼り付けて、コード内のどの行で例外がスローされたかをお知らせください。

于 2011-09-30T06:43:00.277 に答える