有效地显示来自多个连接的结果

问题描述:

在JPA项目中,我需要显示其数据来自5个相关实体的表。 没有JPA,我可以编写一个sql查询,它将5个数据库表连接在一起,并根据某些条件进行过滤。 假设过滤标准中涉及的字段只是第一个实体的字段。 使用JPA我可以加载第一个实体的过滤实例,并浏览属性直到最终实体。 我担心的是,如果我无法使用或者对fecttype = eager注释犯了错误,那么对数据库的查询数量可能会爆炸。 在这种情况下,哪种方法最好? 我想严格控制将要执行的sql查询,所以我可以优化它们,但是如果我用手写联接来编写sql查询,我是否必须使用'old'结果集来检索数据?有效地显示来自多个连接的结果

+0

你能在你的数据库中创建视图的? –

+0

是的,我可以。不幸的是,过滤标准是动态的,所以我不能把它们放在视图内,或者简单地说我不能如何去做。我关心的是过滤过程:如果我首先创建视图并过滤它,那么我必须加入一张非常大的表格,而不仅仅是我感兴趣的行。请阅读以下答案的评论。 – Filippo

+0

好吧,一起使用静态视图和动态查询可能有风险。你能提供更多关于框架或数据库的信息吗? –

您可以使用JPA的内置查询语言JPQL吗? (它确实有一个JOIN操作符。)但请注意,这不是标准的SQL,只是类似的东西,所以请仔细阅读JPQL文档。是的,这仍然是嵌入在Java代码中的纯文本查询,这是一种耻辱,但是,嘿,这就是Java可以支持开发过程的程度。

这里的主要优势在于,您可以获得实体对象作为查询的结果 - 尽管您仍然需要从Object转换它们。您还可以直接在查询字符串中使用对象(记录)及其成员变量(属性),所以这是从旧的JDBC开始的一步。

或者你也可以选择Criteria API,但坦白地说,我的经验并不是很好。语法非常糟糕,你基本上最终会自己构建低级查询。这显然是Java最糟糕的......但至少包含查询的字符串可以从代码中消除。我不确定这是否值得。

检查此页面了解更多信息和示例:

http://download.oracle.com/javaee/6/tutorial/doc/gjise.html

+0

我同意标准API,这是新手真正的噩梦。我的想法如下:创建一个只有很少几行的'怪胎'视图只是为了创建一个实体(让我们称之为summarydata)。使用连接创建一个JPQL查询并添加动态过滤条件。将其转换为summarydata并显示在jsf h:datatable中。它应该工作,不是吗? – Filippo