fetch属性默认值是FetchType.EAGER 
Criteria c=session.createCriteria(Student.class).setFetchMode("address", FetchMode.JOIN);你是去找Student
你把Student找到了 ok,但是每个Student有个Address属性,这个会自动去加载Address里面的Student,所以出现了N+1

解决方案 »

  1.   

    用的hibernate几?设置懒加载试试。
      

  2.   


    hibernate版本是:4.3.5,最新版本。
    我是因为想查出所有记录并导出到excel,所以设置 立即查询。 如果延迟加载,会造成一样的效果:sql语句过多导致查询时间过长。1000条记录就会再去延迟加载1000次,发出1000条sql语句。
      

  3.   

    那你用hibernate的二级缓存看看,这种问题就一种一种的尝试了。
      

  4.   

    你在@OneToOne注解中设置fetch=FetchType.LAZY即可
      

  5.   

    是的,延迟加载不会立即将address对象查询出来,因为我要将student 与address数据 全部从数据库中查询出来并导入到excel中去,如果采用延迟加载,会导致 每个student用到address中属性时 去加载一次,多次加载多次查询,时间过长。hibernate自从3版本就已经是自动延迟加载了,所以我并没有再写,我在条件查询时写上了fetch type =join,是想一次性查出来。
      

  6.   

    是的,延迟加载不会立即将address对象查询出来,因为我要将student 与address数据 全部从数据库中查询出来并导入到excel中去,如果采用延迟加载,会导致 每个student用到address中属性时 去加载一次,多次加载多次查询,时间过长。hibernate自从3版本就已经是自动延迟加载了,所以我并没有再写,我在条件查询时写上了fetch type =join,是想一次性查出来。

    谁说hibernate3版本后自动延迟加载的,JPA的标准,以及JPA注解的源码,只有@OneToMany和@ManyToMany的fetch默认才是延迟加载,@OneToOne和@OneToMany的fetch默认是EAGER
      

  7.   

    是的,延迟加载不会立即将address对象查询出来,因为我要将student 与address数据 全部从数据库中查询出来并导入到excel中去,如果采用延迟加载,会导致 每个student用到address中属性时 去加载一次,多次加载多次查询,时间过长。hibernate自从3版本就已经是自动延迟加载了,所以我并没有再写,我在条件查询时写上了fetch type =join,是想一次性查出来。

    谁说hibernate3版本后自动延迟加载的,JPA的标准,以及JPA注解的源码,只有@OneToMany和@ManyToMany的fetch默认才是延迟加载,@OneToOne和@OneToMany的fetch默认是EAGER我试过了,不加fetch=lazy,它也是延迟加载的。
    ok,现在我全部手动写上fetch=lazy,但是因为我想查出全部数据,所以查询时我用了fetch=join,但是依旧是这样,产生多个sql语句
      

  8.   


    hibernate版本是:4.3.5,最新版本。
    我是因为想查出所有记录并导出到excel,所以设置 立即查询。 如果延迟加载,会造成一样的效果:sql语句过多导致查询时间过长。1000条记录就会再去延迟加载1000次,发出1000条sql语句。
    Address方@onetoone设置LAZY,你只查询Student,就不会出现了N+1
      

  9.   


    hibernate版本是:4.3.5,最新版本。
    我是因为想查出所有记录并导出到excel,所以设置 立即查询。 如果延迟加载,会造成一样的效果:sql语句过多导致查询时间过长。1000条记录就会再去延迟加载1000次,发出1000条sql语句。
    Address方@onetoone设置LAZY,你只查询Student,就不会出现了N+1

    你好,我的需求如下:查询所有student 的信息和对应的address信息,导入到excel。如果只查询student,到用到address的信息时,需要去加载。这样造成如果数据库中student条数多的话,延迟记载address的次数也多,发出的sql语句也多,查询时间就会很长了。所以我想用fetch=join,没想到它们还是发出1+n的sql语句。我尝试过单向的关联,的确有用,但是我不明白,双向关联就只能有1+n这种情况吗
      

  10.   


    hibernate版本是:4.3.5,最新版本。
    我是因为想查出所有记录并导出到excel,所以设置 立即查询。 如果延迟加载,会造成一样的效果:sql语句过多导致查询时间过长。1000条记录就会再去延迟加载1000次,发出1000条sql语句。
    Address方@onetoone设置LAZY,你只查询Student,就不会出现了N+1

    你好,我的需求如下:查询所有student 的信息和对应的address信息,导入到excel。如果只查询student,到用到address的信息时,需要去加载。这样造成如果数据库中student条数多的话,延迟记载address的次数也多,发出的sql语句也多,查询时间就会很长了。所以我想用fetch=join,没想到它们还是发出1+n的sql语句。我尝试过单向的关联,的确有用,但是我不明白,双向关联就只能有1+n这种情况吗
    双线关联也不会的,只要你不用到Address里面关联的Student属性,就不会,如果用到了,就会出现N+1
    还有你可以这样写 from Student s left outer join fetch s.address 这样就把student关联的Address取出来了,你只要不用到Address里面关联的Student属性就行了,前提你把Addres那边的设置为LAZY
      

  11.   


    hibernate版本是:4.3.5,最新版本。
    我是因为想查出所有记录并导出到excel,所以设置 立即查询。 如果延迟加载,会造成一样的效果:sql语句过多导致查询时间过长。1000条记录就会再去延迟加载1000次,发出1000条sql语句。
    Address方@onetoone设置LAZY,你只查询Student,就不会出现了N+1

    你好,我的需求如下:查询所有student 的信息和对应的address信息,导入到excel。如果只查询student,到用到address的信息时,需要去加载。这样造成如果数据库中student条数多的话,延迟记载address的次数也多,发出的sql语句也多,查询时间就会很长了。所以我想用fetch=join,没想到它们还是发出1+n的sql语句。我尝试过单向的关联,的确有用,但是我不明白,双向关联就只能有1+n这种情况吗
    双线关联也不会的,只要你不用到Address里面关联的Student属性,就不会,如果用到了,就会出现N+1
    还有你可以这样写 from Student s left outer join fetch s.address 这样就把student关联的Address取出来了,你只要不用到Address里面关联的Student属性就行了,前提你把Addres那边的设置为LAZY我已经照你说的做了,发现有一些改变,
    第一条语句依旧在,第二条变成了
     select student... from Student  student where student.student_address=???
    第二条不查询address了,但是还是出现第二条,出现1+n问题
      

  12.   

    用batechsize,不过显得有点不专业了  ,据我所知 现在的一对一 都用多对一代替。so..一对一的懒加载倒是第一次遇见。 
      

  13.   


    hibernate版本是:4.3.5,最新版本。
    我是因为想查出所有记录并导出到excel,所以设置 立即查询。 如果延迟加载,会造成一样的效果:sql语句过多导致查询时间过长。1000条记录就会再去延迟加载1000次,发出1000条sql语句。
    Address方@onetoone设置LAZY,你只查询Student,就不会出现了N+1

    你好,我的需求如下:查询所有student 的信息和对应的address信息,导入到excel。如果只查询student,到用到address的信息时,需要去加载。这样造成如果数据库中student条数多的话,延迟记载address的次数也多,发出的sql语句也多,查询时间就会很长了。所以我想用fetch=join,没想到它们还是发出1+n的sql语句。我尝试过单向的关联,的确有用,但是我不明白,双向关联就只能有1+n这种情况吗
    双线关联也不会的,只要你不用到Address里面关联的Student属性,就不会,如果用到了,就会出现N+1
    还有你可以这样写 from Student s left outer join fetch s.address 这样就把student关联的Address取出来了,你只要不用到Address里面关联的Student属性就行了,前提你把Addres那边的设置为LAZY我已经照你说的做了,发现有一些改变,
    第一条语句依旧在,第二条变成了
     select student... from Student  student where student.student_address=???
    第二条不查询address了,但是还是出现第二条,出现1+n问题
    Address 那方的Student属性,你fechType设置LAZY了没?
    顺便把你查询的代码贴出来,贴全点
      

  14.   


    hibernate版本是:4.3.5,最新版本。
    我是因为想查出所有记录并导出到excel,所以设置 立即查询。 如果延迟加载,会造成一样的效果:sql语句过多导致查询时间过长。1000条记录就会再去延迟加载1000次,发出1000条sql语句。
    Address方@onetoone设置LAZY,你只查询Student,就不会出现了N+1

    你好,我的需求如下:查询所有student 的信息和对应的address信息,导入到excel。如果只查询student,到用到address的信息时,需要去加载。这样造成如果数据库中student条数多的话,延迟记载address的次数也多,发出的sql语句也多,查询时间就会很长了。所以我想用fetch=join,没想到它们还是发出1+n的sql语句。我尝试过单向的关联,的确有用,但是我不明白,双向关联就只能有1+n这种情况吗
    双线关联也不会的,只要你不用到Address里面关联的Student属性,就不会,如果用到了,就会出现N+1
    还有你可以这样写 from Student s left outer join fetch s.address 这样就把student关联的Address取出来了,你只要不用到Address里面关联的Student属性就行了,前提你把Addres那边的设置为LAZY我已经照你说的做了,发现有一些改变,
    第一条语句依旧在,第二条变成了
     select student... from Student  student where student.student_address=???
    第二条不查询address了,但是还是出现第二条,出现1+n问题
    Address 那方的Student属性,你fechType设置LAZY了没?
    顺便把你查询的代码贴出来,贴全点
    @Entity
    @Table(name = "ADDRESS")
    public class Address implements java.io.Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="ADDRESS_ID")
    private int addressId;
    @Column(name = "ADDRESS_STREET")
    private String street;
    @Column(name = "ADDRESS_CITY")
    private String city;
    @Column(name = "ADDRESS_STATE")
    private String state;
    @Column(name = "ADDRESS_ZIPCODE")
    private String zipcode;
    @OneToOne(mappedBy="address",fetch=FetchType.LAZY)
    private Student student;@Entity
    @Table(name = "STUDENT")
    public class Student implements java.io.Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="student_id")
    private int studentId;
    @Column(name = "STUDENT_NAME")
    private String studentName;
    @OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
    @JoinColumn(name="student_address",referencedColumnName="ADDRESS_ID")
    private Address address;查询语句如下
    Query query=session.createQuery("from Student s left outer join fetch s.address ");
    List<Student> students=query.list();
    System.out.println("*****");打印出来的sql语句如下select student...,address... from Student student left outer join Address address on student.student_address=address.addressId,select student... from Student  student where student.student_address=???
      

  15.   


    hibernate版本是:4.3.5,最新版本。
    我是因为想查出所有记录并导出到excel,所以设置 立即查询。 如果延迟加载,会造成一样的效果:sql语句过多导致查询时间过长。1000条记录就会再去延迟加载1000次,发出1000条sql语句。
    Address方@onetoone设置LAZY,你只查询Student,就不会出现了N+1

    你好,我的需求如下:查询所有student 的信息和对应的address信息,导入到excel。如果只查询student,到用到address的信息时,需要去加载。这样造成如果数据库中student条数多的话,延迟记载address的次数也多,发出的sql语句也多,查询时间就会很长了。所以我想用fetch=join,没想到它们还是发出1+n的sql语句。我尝试过单向的关联,的确有用,但是我不明白,双向关联就只能有1+n这种情况吗
    双线关联也不会的,只要你不用到Address里面关联的Student属性,就不会,如果用到了,就会出现N+1
    还有你可以这样写 from Student s left outer join fetch s.address 这样就把student关联的Address取出来了,你只要不用到Address里面关联的Student属性就行了,前提你把Addres那边的设置为LAZY我已经照你说的做了,发现有一些改变,
    第一条语句依旧在,第二条变成了
     select student... from Student  student where student.student_address=???
    第二条不查询address了,但是还是出现第二条,出现1+n问题
    Address 那方的Student属性,你fechType设置LAZY了没?
    顺便把你查询的代码贴出来,贴全点我看了一下你的回答,你说只查student,不用address就不会出现N+1,但我要全部查出来啊,需要用address。
      

  16.   


    配置文件我是看到一对多代理一对一,jpa好像还是一对一