Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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

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 Hibernate:对每个集合进行单独的sql查询_Java_Hibernate - Fatal编程技术网

Java Hibernate:对每个集合进行单独的sql查询

Java Hibernate:对每个集合进行单独的sql查询,java,hibernate,Java,Hibernate,我有一个Person类,它有一组联系人。一切正常,我有联系人名单。然而,在日志中,我看到一个单独的查询用于读取每个人的集合。那太糟糕了。 如何使hibernate进行连接以在一个查询中读取所有数据?我使用JPA 这是person类: @Entity @Table(name = "tbl1") public class PersonItem implements Serializable{ @Id @Column(name="col1") private String gu

我有一个Person类,它有一组联系人。一切正常,我有联系人名单。然而,在日志中,我看到一个单独的查询用于读取每个人的集合。那太糟糕了。 如何使hibernate进行连接以在一个查询中读取所有数据?我使用JPA

这是person类:

@Entity
@Table(name = "tbl1")
public class PersonItem implements Serializable{
    @Id
    @Column(name="col1")
    private String guid;
    .....
    @ElementCollection(targetClass = ContactItem.class,fetch=FetchType.EAGER)
    @CollectionTable(name="tbl2",joinColumns=@JoinColumn(name="col2"))
    private List<ContactItem> contacts;
    ....
}
这是我获取人员列表的方式:

Query query = em.createQuery("Select p from PersonItem p WHERE p.guid IN (:guids)");
query.setParameter("guids", guids);
List<PersonItem> list=query.getResultList();
试试你的亲戚。 此外,我建议在这种情况下使用
@OneToMany
关系

@OneToMany(mappedBy = "person", fetch = FetchType.EAGER)
@Fetch(FetchMode.JOIN) //You can use SUBSELECT as well
private List<ContactItem> contacts;
@OneToMany(mappedBy=“person”,fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)//您也可以使用SUBSELECT
私人名单联系人;
您可以阅读有关获取策略的更多信息

  • fetch—“join”=禁用延迟加载,始终加载所有集合和实体
  • fetch-“select”(默认)=延迟加载所有集合和实体
  • batch size=“N”=最多提取“N”个集合或实体,而不是记录
  • fetch—“subselect”=将其集合分组到sub select语句中

  • 请从更简单的映射开始。使用复数名称和列前缀

    @Entity
    @Table(name = "persons")
    public class Person {
    
        @Id
        @Column(name = "f_guid")
        private String guid;
    
        @OneToMany(mappedBy = "person", fetch = FetchType.EAGER)
        private List<Contact> contacts;
    
    }
    
    @Entity
    @Table(name = "contacts")
    public class Contact {
    
        @Id
        @Column(name = "f_guid")
        private String guid;
    
        @Column(name = "f_info")
        private String info;
    
        @ManyToOne(fetch = FetchType.LAZY)    
        @JoinColumn(name = "fk_person")
        private Person person;
    
    }
    
    如果存在重复项(连接原因),则可以使用
    distinct

    select distinct p from PersonItem p left join fetch p.contacts WHERE p.guid IN (:guids)
    

    尝试用LAZY代替EAGER,这样您可能看不到其他查询,原因是,每当您获取Personime的单个实例时,都需要立即加载它,它有义务获取所有关联的实体。@Bilbo Baggins,但我需要立即加载它。您真的需要使用
    @ElementCollection
    ?@JimJim2000如果需要加载它,那么Serghey的答案似乎值得一试。@v.ladynev我只是学习了hibernate,我不知道我还能如何对集合进行注释。不,它没有帮助。可能是因为我使用JPA。为什么需要
    @embeddeble
    ?它是真的需要还是可以用简单的
    @实体替换?我的建议是,这就是问题的原因。我只是研究JPA并尝试不同的解决方案。我认为这是符合规格的正确关系。使用@OneToMany会有什么影响?对我来说,这个例子更像是
    @OneToMany
    关系。这也应该使
    @Fetch
    注释起作用但是结果是相同的-4个查询。如何修复它?我做了
    @OneToMany(fetch=FetchType.EAGER)@JoinColumn(name=“col2”)私人列表联系人结果相同-4个查询。我的错在哪里?谢谢你的帮助。是的,问题出在JPQL中。所以我现在有一个问题。问题是,在结果列表中我有7个人,而在DB中我只有3个人(一个人有4个联系人,一个人有2个联系人,一个人没有联系人)。如何修复它?顺便说一下,我使用了
    @OneToMany(fetch=FetchType.EAGER)@JoinColumn(name=“col2”)私有列表联系人是的,它有帮助。谢谢
    
    @Entity
    @Table(name = "persons")
    public class Person {
    
        @Id
        @Column(name = "f_guid")
        private String guid;
    
        @OneToMany(mappedBy = "person", fetch = FetchType.EAGER)
        private List<Contact> contacts;
    
    }
    
    @Entity
    @Table(name = "contacts")
    public class Contact {
    
        @Id
        @Column(name = "f_guid")
        private String guid;
    
        @Column(name = "f_info")
        private String info;
    
        @ManyToOne(fetch = FetchType.LAZY)    
        @JoinColumn(name = "fk_person")
        private Person person;
    
    }
    
    select p from PersonItem p left join fetch p.contacts WHERE p.guid IN (:guids)
    
    select distinct p from PersonItem p left join fetch p.contacts WHERE p.guid IN (:guids)