使用JPQL从两个表中选择

时间:2010-08-25 15:17:08

标签: java orm jpa-2.0 jpql openjpa

我正在使用JPQL来检索数据。我可以使用语句

获取数据
List persons = null;
persons = em.createQuery("select p.albumName from PhotoAlbum p , Roleuser r 
where r = p.userId and r.userID = 1");

现在我可以使用这个来获取相册名称:

int i=0;
for (i=0;i<persons.size(); i++)
{   
     System.out.println("Testing n "+ i +" " +  persons.get(0));
}

现在我想获取专辑名称和名为firstname

的roleuser行

我正在使用查询

persons = em.createQuery("select r.firstName , p.albumName from PhotoAlbum p ,   
Roleuser r where r = p.userId and r.userID = 1").getResultList();

现在如何获取行firstname和albumname作为persons.get(0)返回一个对象

运行代码:

 for (i=0;i<persons.size(); i++)
    {
        //r = (Roleuser) persons.get(i);
        System.out.println("Testing n "+ i +" " + persons.get(i));
    }

我得到了这个:

Testing n 0 [Ljava.lang.Object;@4edb4077
INFO: Testing n 1 [Ljava.lang.Object;@1c656d13
INFO: Testing n 2 [Ljava.lang.Object;@46dc08f5
INFO: Testing n 3 [Ljava.lang.Object;@654c0a43

如何映射persons.get(0)并获取firstnamealbumname

1 个答案:

答案 0 :(得分:8)

  

现在如何获取行firstname和albumname作为persons.get(0)返回一个对象

SELECT子句中包含多个 select_expressions 的查询将返回Object[](或List Object[])。从JPA规范:

  

4.8.1 SELECT子句的结果类型

     

指定的查询结果的类型   通过查询的SELECT子句是一个   实体抽象模式类型,a   state-field类型,结果   聚合函数,结果   施工作业,或一些   这些序列。

     

SELECT子句的结果类型   由结果类型定义   包含在 select_expressions 中   它。当多个    select_expressions 用于SELECT子句,即查询的结果   是类型Object[],和   此结果中的元素对应于   命令他们的顺序   SELECT子句中的规范和   in type到每个的结果类型    select_expressions

所以在你的情况下,你可能想要这样的东西:

for (i=0;i<persons.size(); i++) {
    //r = (Roleuser) persons.get(i);
    System.out.println("Testing n " + i + " " + persons.get(i)[0] + ", " + 
        persons.get(i)[1]);
}

请注意,指定的内部通过在使用笛卡尔乘积的FROM子句加入,并在连接条件WHERE子句是不是指定显式连接在实体关系(使用[LEFT [OUTER] | INNER ] JOIN语法)不太典型。请参阅规范中的整个 4.4.5联接部分。

参考

  • JPA 1.0规范
    • 第4.8.1节“SELECT子句的结果类型”
    • 第4.8.2节“SELECT子句中的构造函数表达式”
    • 第4.4.5节“加入”