我正在尝试使用带有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()
返回实体及其嵌入实体列表的调用,还是需要以另一种方式执行?如果我需要以另一种方式做,有没有人想出一个好方法呢?
答案 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();
}
});