java - 使用内连接时映射 NativeQuery 结果

标签 java eclipselink jpa-2.0

我有以下情况:

@Entity
@XmlRootElement
@Table(name = "TB_A")
public class A implements Serializable {

    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "CD_B")
    private B b;

}

@Entity
@XmlRootElement
@Table(name = "TB_B")
public class B implements Serializable {

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "CD_B")
    @JsonIgnore
    private Set<C> c = new HashSet<>();

}

@Entity
@XmlRootElement
@Table(name = "TB_C")
public class C implements Serializable {

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "CD_B")
    private B b;

}

我需要运行以下代码:

String sql = "SELECT * FROM TB_A a "
            + "INNER JOIN TB_B b ON ... "
            + "LEFT JOIN TB_C c ON ... ";

Query query = em.createNativeQuery(sql, A.class);

List<A> AList = query.getResultList();

for(A a : AList) {
    List<c> CList = a.getB().getC();
}

分析执行的查询,我注意到每次访问元素 B 和 C 时,JPS 都会运行 SELECT。

如何正确映射此nativeQuery以使用lazyLoad?

  • 观察:我必须使用 NativeQuery,因为在我的 WHERE 子句中我需要使用 Oracle 中的特定函数。所以 JPQL 对我来说不是一个选择(如果我能使用它,我的生活会轻松得多!)。

最佳答案

简短回答:你不能。

这行代码会做什么:

Query query = em.createNativeQuery(sql, A.class);

就是执行你的SQL,然后扔掉任何与A.class无关的东西。

然后你的 for 循环:

for(A a : AList) {
    List<c> CList = a.getB().getC();
}

再次获取所有内容。
这里你再次使用JPA,它不知道你之前执行的查询的任何信息。

在某些情况下,您可以尝试映射到 C.class
然后你就可以完全避免循环。
如果您的情况需要 A.class 和 C.class,您可以查看 ResultSetMapping:http://www.java2s.com/Tutorial/Java/0355__JPA/SqlResultSetMappingForHierarchicalEntity.htm

关于java - 使用内连接时映射 NativeQuery 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44465748/

相关文章:

java - 将字符串转换为多维 int 数组

java - 在 Android 中将阿拉伯语文本转换为 UTF8

java - 尝试将实例转换为 PersistenceCapable 失败。确保它已得到增强

JavaEE + eclipseLink + TomEE 给出 java.sql.SQLSyntaxErrorException : user lacks privilege or object not found

java - 如何加载persistence.xml?

java - 标准 API : Create null value with CriteriaBuilder

java - Docker Jetty 应用程序无权在已安装的卷上写入

C# 中等效的 Java 文件对象

java - jpa,尝试从实体创建表,找不到类 ExpressionVisitor

jpa - 删除关联实体 JPA(或删除 EclipseLink 中的孤立等效项)