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))“)
答案 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();
希望你得到......