0

DataNucleus を使用して 2 つのクラスを永続化することにより、DTO オブジェクトを作成しようとしています。

作成したい DTO:

@PersistenceAware
DtoObject{

   Protected String Id;  //populated by Order class
   Protected String status; //populated by Order class
   Protected String phoneNumber; //populated by Customer class
   Protected String address;  //populated by Customer class
}
The Objects:

 @PersistenceCapable
 @FetchGroup(name="dto", members = {@Persistent(name = "Id"), 
 @Persistent(name="status")})
 public Class Order{
   @PrimaryKey
   @Persistent
   private String Id;
   @Persistent
   private String status;
   @Persistent
   private Customer customer;
}

@PersistenceCapable
@FechGroup(name="dto", members = { @Persistent(name = "phoneNumber"),
@Peristent(name="address") })
public Class Customer{

   @PrimaryKey
   @Persistent
   private String Id;
   @Persistent
   private String phoneNumber;
   @Persistent
   private string Address;
}

JDODL:

Query q = pm.newQuery(Order.class);
            pm.getFetchPlan().setGroup("dto");
            q.setUnique(true);
            q.setFilter("Id == id");
            q.declareParameters("String id");
            q.setResultClass(DtoObject.class);
            DtoObject dto = (DtoObject)q.execute(id);

Order.class にマップされた属性を使用して dto オブジェクトを設定できますが、Customer.class から属性を取得できません。Data Nucleus はテーブルを結合し、各テーブルから適切な列を選択しますが、phoneNumber =null および address = null のままにします。

1 つのクエリでこれを機能させる方法についての指針をいただければ幸いです。

4

1 に答える 1

0
Query q = pm.newQuery("SELECT UNIQUE this.id, this.status, " + 
    " this.customer.phoneNumber, this.customer.address INTO " + 
    DtoObject.class.getName() + 
    " FROM " + Order.class.getName() + " WHERE this.id = :id");
DtoObject dto = (DtoObject)q.execute(idParam);

結果クラス (DtoObject) が結果クラスの条件に従うと仮定する

于 2013-04-16T06:51:37.243 に答える