当前位置: 首页 > 知识库问答 >
问题:

查询两个以上实体

劳豪
2023-03-14

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持久性服务-2.5.0.v20130507-3faac2b):
org.Eclipse.Persistence.exceptions。JPQLException<br>异常描述:语法错误解析[SELECT u(),f()FROM User u join Employee f in u.empid=f.id 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

现在我收到此错误

内部异常:com . Mysql . JDBC . exceptions . JDBC 4 . MySQL syntaxerrorexception:您的SQL语法有错误;请查阅与您的MySQL服务器版本相对应的手册,了解使用near '的正确语法。id))'第1行< br >错误代码: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 =?)和(t0.passowrd =?))和(t0 . empid = t1 . id . t1 . id))< br > bind =

共有3个答案

强德厚
2023-03-14

我认为你不能做这样的事,原因如下。

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

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

这意味着您总是应该查询一个对象。现在你提到的连接怎么样?

实际上,联接是在关系数据建模世界中获得投影的一种方式,同样,它不适用于面向对象的世界,这里我们使用继承和组合进行操作。您可以对上述关系进行建模。

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

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

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

class Employee {

}

class User extends Employee {


}

然后提供到这个对象层次结构的关系映射。有3种不同的策略来绘制这样的东西,你可能会对阅读这篇文章感兴趣

希望这有帮助

邵弘义
2023-03-14

也许是这样的:

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];

编辑:翻译后的查询的这一部分看起来像是您在员工类中遇到了映射问题:

... t1.id.t1.id ... 
邢高爽
2023-03-14

已经问过的问题:JPA:返回多个实体的查询(在本例中是hibernate,什么是JPA的实现)

 类似资料:
  • 问题内容: 我想计算上个月的总订单金额。 我得到了从当前日期获取当前月份数据的查询。 现在,我如何仅获取前一个月的数据,不包括本月。 例如,本月(7月)我赚了15,000美元,上个月(6月)我赚了14,000美元。 通过运行上述查询,我​​得到了$ 15,000。 但是我不知道如何计算上个月。 问题答案: 在这里,您可以使用它在MySQL中获取上个月的第一个月到上个月的最后一天之间的日期:

  • 问题内容: 我想同时计算一个表中的记录总数和符合某些条件的记录总数。我可以使用两个单独的查询来完成这些操作: 有没有一种方法可以将它们组合成一个查询,以便在一行中得到两个字段? 如果没有,我可以发出两个查询并将它们包装在一个事务中,以便它们保持一致,但是我希望使用一个查询来完成。 编辑:我最关心原子性;如果需要两个子SELECT语句就可以,只要某个地方有INSERT,它就不会使两个响应不一致。 编

  • 我有2个与数据库表映射的类。 复合主键类: 1 : 加载配置文件 2:前进动力 我想执行查询 我使用JPA标准在java中编写了一个等效的查询 查询 我将选项设置为hibernate.show_sql = true。现在,该查询为我提供了确切的1000个所需结果。当我看到由ORM通过上述代码生成的Hibernate查询时。ORM为能量表创建1个查询,为前功率表创建1000个查询,这会导致性能问题,

  • 问题内容: 我想知道如何比较两个不同的数据库 表记录 。我的意思是,我将比较两个数据库表,它们可能具有不同的列名但具有相同的数据。但是其中一个表可能比另一个表具有更多的记录,因此我想看看这两个表之间的区别是什么。为此,如何编写sql查询?仅供参考:这两个数据库都在同一个SQL Server实例下。 然后,在比较表1和表2之后,它应该 从 表2返回 Ruby Core。 问题答案: 如果执行从T1到

  • 问题内容: 我要么变老,要么我需要写的查询变得越来越复杂。以下查询将获取与该用户的所有关联。 该表为(,,,); 现在,我还需要通过 独立查询如下所示: 但是,是否可以将这两个查询合并为一个查询?我的逻辑认为应该这样,尽管我不知道如何进行实际的JOIN。 问题答案: 我可能会使用UNION。

  • 问题内容: 两个查询都一样吗?两者返回相同的结果吗? 1) 2) 问题答案: 它们不一样。 第二个返回 两个 条件的数据。 第一个首先测试,并且仅适用一个条件