0

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

我目前的做法如下:

我在实体类中使用了一个命名查询来进行查询。(Primary Entity 是 Name,Embedded 实体是一个 Suffix 实体,叫做 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(),或者我需要用另一种方式吗?如果我需要以另一种方式做,有没有人想出一个好的方法?

4

1 回答 1

0

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

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(); 
  }
});
于 2013-07-13T06:53:06.847 回答