查询两个以上的实体

时间:2013-12-03 07:24:39

标签: java mysql jpa eclipselink

JPQl我是jpa的新手,我想查询两个实体的所有字段,然后使用实体类getter来访问数据。

Query q = em.createQuery("SELECT u(*),f(*) FROM User u join Employee f in u.empid=f.id WHERE u.username = :login AND u.passowrd = :pass");
        q.setParameter("login", usernameTextField.getText().trim());
        q.setParameter("pass", passwordPasswordField.getText().trim());

错误

  

异常[EclipseLink-0](Eclipse Persistence Services - 2.5.0.v20130507-3faac2b):
  org.eclipse.persistence.exceptions.JPQLException
  异常描述:语法错误解析[SELECT u(),f()FROM User u join uffid = f.id中的Employee f WHERE u.username =:login AND u.passowrd =:pass ]。
  [9,9]算术表达式中缺少左表达式   [10,10]算术表达式中缺少正确的表达式   [15,15]算术表达式中缺少左表达式   [16,16]算术表达式中缺少正确的表达式   [7,8] SELECT子句的'u'和'()'没有用逗号分隔。
  [13,14] SELECT子句的'f'和'(
)'没有用逗号分隔。
  [56,57] FROM子句的'User u JOIN Employee f IN u.empid ='和'f.id'没有用逗号分隔。
  [46,57]表达式无效,这意味着它不遵循JPQL语法   [62,62]必须为范围变量声明提供标识变量。

谢谢大家的贡献......到目前为止,我已将查询修改为此

SELECT u,f 
FROM User u, Employee f  
WHERE u.username = :login AND u.passowrd = :pass AND u.empid=f.id

现在我收到此错误

  

internal Exception:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:SQL语法中有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“.id)”附近使用正确的语法   错误代码:1064
  调用:SELECT t0.id,t0.level,t0.passowrd,t0.username,t0.empid,t1.id,t1.address,t1.email,t1.gender,t1.idnum,t1.name,t1.phone ,t1.staffcol,t1.dept FROM user t0,staff t1 WHERE(((t0.username =?)AND(t0.passowrd =?))AND(t0.empid = t1.id.t1.id))
  bind => [2个参数界限]
  查询:ReportQuery(referenceClass = User sql =“SELECT t0.id,t0.level,t0.passowrd,t0.username,t0.empid,t1.id,t1.address,t1.email,t1.gender,t1.idnum ,t1.name,t1.phone,t1.staffcol,t1.dept FROM user t0,staff t1 WHERE(((t0.username =?)AND(t0.passowrd =?))AND(t0.empid = t1.id .t1.id))“)

4 个答案:

答案 0 :(得分:1)

问题已经问过: JPA: Query that returns multiple entities (在这个例子中,它是hibernate什么是实现von jpa)

答案 1 :(得分:1)

也许是这样的:

Query q = em.createQuery("SELECT u, f FROM User u, Employee f WHERE u.empid = f.id and u.username = :login AND u.passowrd = :pass");
        q.setParameter("login", usernameTextField.getText().trim());
        q.setParameter("pass", passwordPasswordField.getText().trim());
Object[] result = (Object[]) q.getSingleResult();
User user = result[0];
Employee emp = result[1];

编辑:您翻译的查询的这部分内容似乎在您的Employee类中存在映射问题:

... t1.id.t1.id ... 

答案 2 :(得分:0)

我认为你不能做这样的事情,这就是为什么。

您发布的查询受到关系方法的“启发”,即您查询具有任意字段的表(可能由连接生成,甚至可能是人为的)。

JPA本质上是一个ORM框架 - 这意味着它通过将它包装在Object中来封装关系结构。 因此,您必须使用对象作为关系数据世界的常见功能。

这意味着您始终应该查询对象。 现在你提到的加入怎么样?

实际上,join是一种在关系数据建模领域进行投影的方法,同样不是面向对象的世界,在这里我们使用继承和组合。 您可以使用上述相同的关系建立模型。

因此,在基于对象的数据建模世界中,您应该考虑用户和员工之间的“关系”,就像这些是对象而不是不同的表一样 - 认为是面向对象的语言程序员而不是SQL用户。

在这种特殊情况下,我的第一个赌注就是说用户'是'具有一些额外信息的员工(我可能错了,更多的是数据建模问题,可能是相反的,所以你应该考虑一下) )。

所以你在java中定义了Employee类 然后在java中定义类User:

class Employee {

}

class User extends Employee {


}

然后,您为此对象层次结构提供关系映射。 有三种不同的策略来映射这样的事情,你可能会在阅读this

时感兴趣

希望这有帮助

答案 3 :(得分:0)

我不是专家,但我认为:

使您的返回类型主要实体如下。

public User methodWhichReturnsListAfterQuery(){    
    Query q = em.createQuery("SELECT u FROM User u join u.employee f WHERE  u.empid=f.id AND u.username = :login AND u.passowrd = :pass");
    q.setParameter("login", usernameTextField.getText().trim());
    q.setParameter("pass", passwordPasswordField.getText().trim());
     return (User)query.getSingleResult();
}

我认为您的主要实体是User

您的User实体如下:

public class User Implements Serializable{
    .
    .
    //Some relation type
    private Employee employee;
    .
    .
    //getter() and setter()
}

查询后获取值

User user= methodWhichReturnsListAfterQuery ();

现在你可以获得这样的值:

String userName=user.getUserName();
String password=user.getPassword();
String name=user.getEmployee().getName();
Long departMentId=user.getEmoloyee().getDepartmentId();

希望你得到......