Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否所有属性都在引擎盖下左连接?_Java_Hibernate_Hql - Fatal编程技术网

Java 是否所有属性都在引擎盖下左连接?

Java 是否所有属性都在引擎盖下左连接?,java,hibernate,hql,Java,Hibernate,Hql,我的实体如下所示:为了简化,我只显示两个字段。我们决定执行“全部获取”以一次加载所有属性 @Entity public class Person{ @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Set<PhoneNumber> phoneNumbers = new HashSet<>(0); @ManyToOne(fetch =

我的实体如下所示:为了简化,我只显示两个字段。我们决定执行“全部获取”以一次加载所有属性

    @Entity     
    public class Person{
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<PhoneNumber> phoneNumbers = new HashSet<>(0);
     @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "AGENCY_ID")
        private Agency agency;
使用distinct:左连接,这会给出“ORA-01791:不是选定的表达式”,因为我在order子句中使用了代理字段

select distinct person
    from Person person left join person.agency ag left join person.phoneNumbers 
    where upper(person.name) LIKE '%SU%' and upper(person.Status.rcode)   = 'ACTIVE'
    order by person.agency.name asc, person.id asc
左连接提取:此操作正常,没有重复项。但由于创下了2000人的记录,这一成绩大获成功。用了大约15秒,与刚离开的1秒相比

select  person
        from Person person left join fetch person.agency ag left join fetch person.phoneNumbers 
        where upper(person.name) LIKE '%SU%' and upper(person.Status.rcode)   = 'ACTIVE'
        order by person.agency.name asc, person.id asc
 select person
    from Person person 
    fetch all properties
    where upper(person.name) LIKE '%SU%' and upper(person.status) = 'ACTIVE'
    order by  person.id asc
获取所有属性:无重复项。表现更好,但是。。 当我尝试查询下面这样的人时(此人没有任何代理):它返回person记录(这意味着它正在进行左连接)

但是当我在下面做的时候,我不会把个人记录拿回来。(区别是在ORDERBY子句中添加了代理字段,在这种情况下似乎并没有执行left join。)


我要寻找的是避免重复,可由性能良好的人员的所有字段进行排序。

导航路径语法(
person.agency
)始终转换为内部联接,这就是没有代理的人员不包括在结果集中的原因

必须显式编写外部联接以避免隐式内部联接:

select person
from Person person left outer join person.agency a
where upper(person.name) LIKE '%SU%' and upper(person.status) = 'ACTIVE'
order by a.name asc, person.id asc
编辑

left join
案例中的
distinct
不起作用,因为按
select distinct
子句中提到的列之外的列排序没有意义

如果您想在查询中急切地加载惰性关联,那么您别无选择,只能执行
左连接获取
。但也会返回副本。要消除它们,只需将返回的列表添加到
LinkedHashSet
即可保留返回的顺序:

List<Persons> result = new ArrayList(new LinkedHashSet(list))
List result=new ArrayList(new LinkedHashSet(List))
关于这种方法的糟糕性能,Hibernate与此无关。您可能在保留连接获取的实体中有一些急切加载的实体(因此受到n+1选择问题的困扰),或者复制的实体非常大(因此生成并传输一个大的结果集)


为了避免性能问题,您可能希望使用左连接获取集合,而不是左连接获取集合。

JPA中没有“获取所有属性”这样的语法。谢谢dragon bozanovic。是的,我注意到当我处理查询时,我们在这里执行fetchall的原因是为了获得正确的人数。当我只做“left join”时:此人已在内设置,如果设置的电话号码大于1,则查询将返回重复的人员。然后我们尝试了“left join fetch”,这会导致性能下降。所以我们转向了“fetchall properties”,它的性能很好,但在使用person.agency order by子句时没有执行左连接。我正在尝试编写一个解决所有问题的查询。这就是我现在尝试的:“left join person.phoneNumber left join person.agency fetch all properties”返回重复记录。如果我只是获取所有属性,我看不到任何重复项。@rohith如果您加入一个集合,重复项是很自然发生的。然后只需使用
distinct
消除重复项:
从…中选择distinct person
对不起,我忘了提到distinct的问题。当我尝试按代理字段排序时,会出现“非选定表达式错误”。我的查询:“从person-person-left中选择不同的person-join-person.agency ag获取upper(person.name)的所有属性,如“%SU%”和upper(person.status)=“ACTIVE”order by-ag.name asc,person.id asc”在此上下文中,我建议您忘记
获取所有属性。没有它还能用吗?
select person
from Person person left outer join person.agency a
where upper(person.name) LIKE '%SU%' and upper(person.status) = 'ACTIVE'
order by a.name asc, person.id asc
List<Persons> result = new ArrayList(new LinkedHashSet(list))