【问题标题】:JPA / eclipselink: join fetch all children annotated @OneToOne in one queryJPA / eclipselink:在一个查询中加入获取所有注释@OneToOne的孩子
【发布时间】:2016-08-19 06:08:05
【问题描述】:

我们尝试在一个查询中加入获取数据,但只有 LocationAddress 是加入获取的。对于 LocationGeodata jpa 总是产生第二个查询。 LocationAddress 中的@JoinFetch-Annotation 不受尊重。

给定以下模型和单向注释:

位置-----位置地址-----位置地理数据

每个位置都有一个地址,每个地址都引用一个全球地理数据表。我们还允许我们在任何表中都没有空值。

映射:

@Entity
public class Location {

   @OneToOne(cascade=CascadeType.ALL)
   @JoinFetch(JoinFetchType.INNER)  
   private LocationAddress locationAddress;
}

@Entity
public class LocationAddress {

    @OneToOne   
    @JoinFetch(JoinFetchType.INNER)
    private LocationGeodata locationGeoData;    
}

通过 id 选择位置总是会产生两个查询:

@NamedQuery(
        name="Location.getById",              
        query="SELECT l FROM Location l WHERE l.id = :id"
)

//produces same sql-result as above query
@NamedQuery(
        name="Location.getById",              
        query="SELECT l, lg FROM Location l
               JOIN FETCH l.locationAddress a
               JOIN FETCH a.locatonGeodata lg
               WHERE l.id = :id"
)

SELECT t1.ID, t1.DESCRIPTION, t1.LOCATIONADDRESS_ID, t2.STREET, 
       t2.HOUSENUMBER, t2.LOCATIONGEODATA_ID FROM LOCATION t1 
INNER JOIN LOCATIONADDRESS t2 
WHERE t1.LOCATIONADDRESS_ID = t2.ID AND t1.ID = ?


SELECT ID, ADMINCODE1, ADMINNAME1, COUNTRYCODE, LAT, LONG 
FROM LOCATIONGEODATA WHERE (ID = ?)

我们如何将第二个查询合并到第一个查询中?谢谢你的建议!

相关表定义:

位置
locationAdress_ID

位置地址
loationGeoData_ID

【问题讨论】:

    标签: jpa orm eclipselink jpa-2.1


    【解决方案1】:

    奇怪,我花了几天时间尝试错误并找到答案,然后在这里发布问题后,找到了解决方案。添加查询提示会产生所需的查询:

    @NamedQuery(
        name="Location.getById",              
        query="SELECT l FROM Location l WHERE l.id = :id",
        hints= {
            @QueryHint(name = "eclipselink.join-fetch", 
                       value = "l.locationAddress.locationGeodata")               
        }
    

    )

    感谢

    http://java-persistence-performance.blogspot.de/2010/08/batch-fetching-optimizing-object-graph.html

    主题是指“嵌套连接获取查询提示”部分

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多