Java Spring数据,获取行多个一个/一个多个关系?

Java Spring数据,获取行多个一个/一个多个关系?,java,spring,jpa,spring-data,spring-data-jpa,Java,Spring,Jpa,Spring Data,Spring Data Jpa,我正在使用Spring数据进行Spring项目。我有以下型号: Location.java @Entity @Table(name = "location") @JsonIgnoreProperties(ignoreUnknown = true) public class Location { @Id @GeneratedValue private int id; private String latitude; private String lon

我正在使用Spring数据进行Spring项目。我有以下型号:

Location.java

@Entity
@Table(name = "location")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Location {

    @Id
    @GeneratedValue
    private int id;

    private String latitude;

    private String longitude;

    private String date;

    @ManyToOne
    @JoinColumn(name ="user")
    @JsonBackReference
    private User user;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
    ...
    ...
}
@Entity
@Table(name = "users")
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {

    @Id
    @GeneratedValue
    private int uid;
    private String first_name;
    private String last_name;
    private String email;
    private String password;
    private boolean enabled;
    private String avatar;

    @Enumerated(EnumType.STRING)
    @Column(name = "user_role")
    private Role role;

    @OneToMany(mappedBy="user")
    @JsonManagedReference
    private List<Location> locations;

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public List<Location> getLocations() {
        return locations;
    }

    public void setLocations(List<Location> locations) {
        this.locations = locations;
    }

}
User.java

@Entity
@Table(name = "location")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Location {

    @Id
    @GeneratedValue
    private int id;

    private String latitude;

    private String longitude;

    private String date;

    @ManyToOne
    @JoinColumn(name ="user")
    @JsonBackReference
    private User user;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
    ...
    ...
}
@Entity
@Table(name = "users")
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {

    @Id
    @GeneratedValue
    private int uid;
    private String first_name;
    private String last_name;
    private String email;
    private String password;
    private boolean enabled;
    private String avatar;

    @Enumerated(EnumType.STRING)
    @Column(name = "user_role")
    private Role role;

    @OneToMany(mappedBy="user")
    @JsonManagedReference
    private List<Location> locations;

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public List<Location> getLocations() {
        return locations;
    }

    public void setLocations(List<Location> locations) {
        this.locations = locations;
    }

}
目标使用crudepository,我想获取所有位置的列表,无论是否有相应的用户

public interface LocationRepository extends CrudRepository<Location, Integer> {

    List<Location> findAll();

    @Query("SELECT l FROM Location l")
    List<Location> findLast();

}
将使用相应的用户获取所有位置

问题:两个查询都获得了相应用户的所有位置


我做错了什么?谢谢

问题在于您正在映射
位置
,以便始终检索
用户
(反之亦然)。如果不希望出现这种行为,可以使用以下方法标记以惰性方式获取
用户


这样,,
位置
中的
用户用户
只有在通过getter访问并且在有效会话内时才会被检索。

@NidhalRouissi阅读了我答案的最后一部分:
位置
中的
用户
只有在通过getter访问并且在有效会话内时才会被检索session.Now获取此异常:org.hibernate.LazyInitializationException:无法初始化代理-没有会话我正在使用Crudepository以尽可能避免手动方法实现,是否有方法决定从何处获取用户对象,或者不只是通过更改查询?@NidhalRouissi如果需要,在会话中检索
用户
。通常,会话/事务应该处于服务级别,而不是存储库级别,因此在服务层中,您可以定义是否希望/需要访问所需字段。好的,这是一条要走的路,但是如果始终加载用户对象,那么在JPQL查询中使用JOIN有什么意义?
@ManyToOne(fetch=FetchType.LAZY, optional=false)
@JoinColumn(name ="user")
@JsonBackReference
private User user;