JDO查询返回零结果

时间:2012-07-22 22:08:49

标签: gwt jdo

我正在构建一个GWT应用程序来访问服务器端使用JDO持久保存的房屋列表。然后通过RPC“getHouseService”将房屋列表移动到客户端以进行显示和操作。之后它们不会被返回并保存在服务器端。

当我运行应用程序并执行RPC服务时,客户端始终会获得一个空列表。 在测试期间,我注意到我在调试模式下的ide(eclipse)注意到getHouse中返回列表的值是StreamingQueryResult。

我做错了什么?我已经坚持这个问题超过一个星期,我无法在线找到相关的解决方案。

这是我编写的用于处理数据持久性的代码:

public static PersistenceManagerFactory getPersistenceManagerFactory() {
        return pmfInstance;
    }

    public void addHouse(List<House> listofHouses) {
        PersistenceManager pm = getPersistenceManagerFactory().getPersistenceManager(); 
        try {
            pm.makePersistentAll(listofHouses);
            System.out.println("after makePersistentAll");
        }
        finally {
            pm.close();
        }
    }

    @SuppressWarnings("unchecked")
    public List<House> getHouses() {
        PersistenceManager pm = getPersistenceManagerFactory().getPersistenceManager();
    List<House> houseList = (List<House>) pm.newQuery("select from " + House.class.getName()).execute();
    return houseList;
    }

众议院的课程是:

package vancouverHEA.shared;

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

import org.datanucleus.jpa.annotations.Extension;

import com.google.gwt.user.client.rpc.IsSerializable;

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class House extends Building implements IsSerializable {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    @Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
    private Long key;
    @Persistent (serialized = "true")
    java.lang.Double landPrice;
    @Persistent (serialized = "true")
    java.lang.Double housePrice;
    @Persistent (serialized = "true")
    java.lang.Boolean forSale;
    @Persistent (serialized = "true")
    private java.lang.String realtorContact;
    @Persistent (serialized = "true")
    private java.lang.Integer listPrice;
    @Persistent (serialized = "true")
    private java.lang.Integer yrBuilt;
    @Persistent (serialized = "true")
    private java.lang.Integer yrReno;
    @Persistent (serialized = "true")
    private java.lang.String postalCode;
    @Persistent (serialized = "true")
    java.lang.Double latitude;
    @Persistent (serialized = "true")
    java.lang.Double longitude;

    String STRATA = "Strata";
    String SINGLE = "Single House" ;


    public House(double landPrice, double improvPrice, String address,
            String postalCode, int yrBuilt, int yrReno) {
        super();
        this.landPrice = landPrice;
        this.housePrice = improvPrice;
        this.address = address;
        this.postalCode = postalCode.trim().toUpperCase();
        this.yrBuilt = yrBuilt;
        this.yrReno = yrReno;
    }


    public String getPostalCode() {
        return postalCode;
    }


    public void setPostalCode(String postalCode) {
        this.postalCode = postalCode.trim().toUpperCase();
    }


    public double getLatitude() {
        return latitude;
    }


    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }


    public double getLongitude() {
        return longitude;
    }


    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }



    public double getPrice() {
        return this.landPrice + this.housePrice;
    }

    public boolean isForSale() {
        return forSale;
    }


    public void setForSale(boolean forSale) {
        this.forSale = forSale;
    }


    public String getRealtorContact() {
        return realtorContact;
    }


    public void setRealtorContact(String realtorContact) {
        this.realtorContact = realtorContact;
    }


    public int getListPrice() {
        return listPrice;
    }


    public void setListPrice(int listPrice) {
        this.listPrice = listPrice;
    }


    public int getYrBuilt() {
        return yrBuilt;
    }


    public void setYrBuilt(int yrBuilt) {
        this.yrBuilt = yrBuilt;
    }


    public int getYrReno() {
        return yrReno;
    }


    public void setYrReno(int yrReno) {
        this.yrReno = yrReno;
    }


    public void setLandPrice(Double landPrice) {
        this.landPrice = landPrice;
    }

    public double getLandPrice(){
        return landPrice;
    }

    public void setHousePrice(Double housePrice) {
        this.housePrice = housePrice;
    }

    public double getHousePrice() {
        return housePrice;
    }

}

1 个答案:

答案 0 :(得分:0)

这可能与此问题中描述的问题相同:GWT retrieve list from datastore via serviceimpl总结列表是惰性加载的,因此如果您通过RPC返回列表,则它尚未读取并返回空列表。关于问题https://stackoverflow.com/a/7646549/66416的答案建议在返回之前调用列表上的size(),这将触发列表被读取(虽然不确定这是否是最优雅的解决方案)。