GAE。如何使用JDO查询childs的属性?

时间:2012-01-22 04:21:27

标签: java google-app-engine collections jdo

基于GAE JDO页面(http://code.google.com/appengine/docs/java/datastore/jdo/relationships.html),我创建了一对多的Employee和ContactInfo对象。

public class Employee implements Serializable{
    @Persistent(mappedBy = "employee", defaultFetchGroup = "true")
    @Element(dependent = "true")
    private List<ContactInfo> contactInfoSets;
...

public class ContactInfo implements Serializable{
    @Persistent
    private String streetAddress;
...

我尝试执行下面的代码总是给我错误(java.lang.AssertionError:expected:&lt; 1&gt;但是:&lt; 0&gt;)因为但返回值是0。

String statement = "SELECT FROM " + Employee.class.getName() 
    + " WHERE contactInfoSets.contains(i) && i.streetAddress=='myaddress'"
    + " VARIABLES " + ContactInfo.class.getName() + " i ";
javax.jdo.Query query = pm.newQuery(statement);
List<ContactInfo> companyProfiles = (List<ContactInfo>) query.execute();

谢谢...

这里是代码

[Employee.java]

import java.io.Serializable;
import java.util.List;

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 javax.jdo.annotations.Element;

import com.google.appengine.api.datastore.Key;

@SuppressWarnings("serial")
@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class Employee implements Serializable{

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent(mappedBy = "employee", defaultFetchGroup = "true")
    @Element(dependent = "true")
    private List<ContactInfo> contactInfoSets;

    public List<ContactInfo> getContactInfoSets() {
        return contactInfoSets;
    }
    public void setContactInfoSets(List<ContactInfo> contactInfoSets) {
        this.contactInfoSets = contactInfoSets;
    }
    public Key getKey() {
        return key;
    }
    public void setKey(Key key) {
        this.key = key;
    }
}

[ContactInfo.java]

import java.io.Serializable;

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 com.google.appengine.api.datastore.Key;

@SuppressWarnings("serial")
@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class ContactInfo implements Serializable{

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;


    @Persistent
    private String streetAddress;

    @Persistent
    private Employee employee;      

    public Key getKey() {
        return key;
    }

    public void setKey(Key key) {
        this.key = key;
    }   

    public String getStreetAddress() {
        return streetAddress;
    }

    public void setStreetAddress(String streetAddress) {
        this.streetAddress = streetAddress;
    }

    public Employee getEmployee() {
        return employee;
    }

    public void setEmployee(Employee employee) {
        this.employee = employee;
    }   
}

[TestJdoCollection.java]

import static com.google.appengine.api.datastore.FetchOptions.Builder.withLimit;
import static org.junit.Assert.assertEquals;

import java.util.ArrayList;
import java.util.List;

import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.cea.common.service.CeaServiceFactory;
import com.cea.common.service.PersistenceService;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;

public class TestJdoCollection {
private final LocalServiceTestHelper helper = new LocalServiceTestHelper(
        new LocalDatastoreServiceTestConfig());   

    private DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

    @Before
    public void setUp() {
        helper.setUp();
    }

    @After
    public void tearDown() {
        helper.tearDown();
    }

    @Test   
    public void test(){
        CeaServiceFactory ceaServiceFactory = CeaServiceFactory.getInstance();
        PersistenceService servicePersistance = (PersistenceService) ceaServiceFactory.getCeaService(CeaServiceFactory.SERVICE_PERSISTANCE);        
        PersistenceManagerFactory pmf = servicePersistance.getPersistenceManagerFactory();
        PersistenceManager pm = pmf.getPersistenceManager();

        ContactInfo contactInfo = new ContactInfo();
        contactInfo.setStreetAddress("myaddress");

        Employee employee  = new Employee();
        List<ContactInfo> contactInfoSets = new ArrayList<ContactInfo>();
        contactInfoSets.add(contactInfo);
        employee.setContactInfoSets(contactInfoSets);       

        pm.makePersistent(employee);

        assertEquals(1, ds.prepare(new Query("Employee")).countEntities(withLimit(10)));
        assertEquals(1, ds.prepare(new Query("ContactInfo")).countEntities(withLimit(10)));

        String statement = "SELECT FROM " + Employee.class.getName() + " WHERE contactInfoSets.contains(i) && i.streetAddress=='myaddress'"
                + " VARIABLES " + ContactInfo.class.getName() + " i ";
        javax.jdo.Query query = pm.newQuery(statement);
        List<ContactInfo> companyProfiles = (List<ContactInfo>) query.execute();        
        assertEquals(1, companyProfiles.size());

    }
}

0 个答案:

没有答案