你可以使用RequestFactory的.with()方法和命名查询吗?

时间:2013-07-12 15:59:36

标签: sql gwt requestfactory

我正在尝试使用带有Hibernate / JPA的RequestFactory调用数据库,并且我想要检索返回嵌入实体的实体列表。我知道.with()方法适用于像.find()这样的方法,但它似乎不适用于自定义查询。

我现在这样做的方式如下:

我在查询的实体类中使用了一个命名查询。 (主要实体是名称,嵌入式实体是名为nameSuffix的后缀实体)

@NamedQueries({ @NamedQuery(name = "Query.name", query = "select * from NameTable") })

然后在服务类中,我想用RequestFactory调用的.list()方法如下所示。

public List<Name> list() {
    return emp.get().createNamedQuery("Query.name").getResultList();
}

最后,这是我在客户端代码中进行调用的方式:

NameRequest context = requestFactory.createNameRequest();
context.list().with("nameSuffix").fire(new Receiver<List<NameProxy>>(){
    public void onSuccess(List<NameProxy> response) {
       String suff = response.get(0).getNameSuffix().getText();

    }
});

在上面的代码中,它表示getNameSuffix()返回null,这意味着.with("nameSuffix")不能像使用标准.list()方法那样使用.find()调用。

有没有办法构建一个使用.with()返回实体及其嵌入实体列表的调用,还是需要以另一种方式执行?如果我需要以另一种方式做,有没有人想出一个好方法呢?

1 个答案:

答案 0 :(得分:0)

我认为您误解了with()方法的用途,除非您有一个返回getNameSuffix实体的方法NameSuffix。这就是documentation所说的:

When querying the server, RequestFactory does not automatically populate relations in the object graph. To do this, use the with() method on a request and specify the related property name as a String

因此,您必须传递给该方法的是您要检索的子实体名称的列表。我希望这个例子可能会有所帮助:

class A {
   String getS(){return "s-a"}
   B getB(){return new B();}
}
class B {
   String getS(){return "s-b";}
   C getC(){return new C();}
}
class C {
   String getS(){return "s-c";}
}

context.getA().fire(new Receiver<A>(){
  public void onSuccess(A response) {
    // return 's-a'
    response.getS();
    // trhows a NPE
    response.getB().getS(); 
  }
});
context.getA().with("b").fire(new Receiver<A>(){
  public void onSuccess(A response) {
    // return 's-a'
    response.getS();
    // return 's-b'
    response.getB().getS(); 
    // trhows a NPE
    response.getB().getC().getS(); 
  }
});
context.getA().with("b.c").fire(new Receiver<A>(){
  public void onSuccess(A response) {
    // return 's-a'
    response.getS();
    // return 's-b'
    response.getB().getS(); 
    // return 's-c'
    response.getB().getC().getS(); 
  }
});