java - Spring Data,获取行ManyToOne/OneToMany关系?

标签 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 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;
    }
    ...
    ...
}

User.java

@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;
    }

}

数据库

CREATE TABLE location (
id integer NOT NULL,
"user" integer,
...
CONSTRAINT location_pkey PRIMARY KEY (id),
CONSTRAINT location_user_fkey FOREIGN KEY ("user")
    REFERENCES users (uid) MATCH SIMPLE
    ON UPDATE NO ACTION ON DELETE NO ACTION
);

CREATE TABLE users
(
uid integer NOT NULL,
...
CONSTRAINT users_pkey PRIMARY KEY (uid)
)

目标使用 CrudRepository,我想获取包含或不包含相应用户的所有位置的列表!

public interface LocationRepository extends CrudRepository<Location, Integer> {

    List<Location> findAll();

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

}

据我了解,上面的查询将获取没有相应用户的所有位置,但以下

@Query("SELECT l FROM Location l JOIN l.user u")

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

问题:两个查询都获取具有相应用户的所有位置!

我在这里做错了什么?谢谢

最佳答案

问题在于您将 Location 映射为始终检索 User(反之亦然)。如果您不希望出现此行为,可以使用 FetchType.LAZY 标记以惰性方式获取 User :

@ManyToOne(fetch=FetchType.LAZY, optional=false)
@JoinColumn(name ="user")
@JsonBackReference
private User user;

这样,只有在通过 getter 访问并且位于有效 session 内时,才会检索 Location 中的 User user

关于java - Spring Data,获取行ManyToOne/OneToMany关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23246286/

相关文章:

java - Struts tag-tiles 无法在 web.xml 或 jar 文件中解析

java - 进程意外退出:构建失败,出现异常

java - Jersey (jsr 311)和自定义 ViewProcessor

java - 无法在 spring rest 模板客户端中找到请求目标的有效认证路径

java - 数据库连接匮乏

hibernate - 为什么 Hibernate 的 EntityManager.find() impl 会抛出 EntityNotFoundException?

java - 初学者 java - 打印表格

java - 尝试在 websphere 8.5.5.13 上部署 Ear 时出现 AnnotationException?

java - 如何使用 Jackson 自动解析 Spring Boot 应用程序中的 JSON

jpa - 使用 jpa 条件查询获取列的最大值