有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

不带关系实体的java JPA存储库选择

我有两个具有关系的实体(hibernate)。当我通过JPA repository获取实体时,然后休眠对两个实体进行“选择”。如何通过一次选择获得实体(此时我不需要第二个实体)

对不起,我的英语和技术语言-我是初学者

编辑

用户:

@Entity
public class User {

@Id
@GeneratedValue
private int id;

private String name;

@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
private List<Medicament> medicaments;

//and others and getters and setters
}

药剂:

@Entity
public class Medicament {

@Id
@GeneratedValue
private int id;

private String name;

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

//and others and getters and setters
}

我从autowired接口UserRepository调用方法:

public interface UserRepository extends JpaRepository<User, Integer>{

@Query("select u from User u where name = :name")
User findByNameQuery(@Param("name") String name);

User findByName(String name);
}

方法findByNameQueryfindByName都进行多重选择


共 (2) 个答案

  1. # 1 楼答案

    改变

    @OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
    private List<Medicament> medicaments;
    

    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private List<Medicament> medicaments;
    

    或者根本不指定FetchType。@OneToMany@ManyToMany的默认值是LAZY,而EAGER的默认值是@OneToOne

  2. # 2 楼答案

    @Tomas Kralik它在工作!谢谢

    你能告诉我什么更好用吗

    具有延迟提取的实体,并在控制器中使用此实体:

    User user = userRepository.findByName(name);
    List<Medicament> medicaments = medicamentRepository.findByUser(user);
    

    或者使用“快速获取”并使用以下代码:

    User user = userRepository.findByName(name);
    List<Medicament> medicaments = user.getMedicaments();
    

    或者,如果需要的话,我可以更改它(一种方式是将实体与fetch-EAGER一起使用,另一种方式是将同一实体与fetch-LAZY一起使用)

    编辑:

    我找到了解决办法: 我已将查询更改为:

    @Query("select u from User u JOIN FETCH u.medicaments m where u.name = :name")
    User findByNameQuery(@Param("name") String name);
    

    和实体用户具有抓取延迟,在我使用的控制器中:

    User user = userService.findByName(name);
    List<Medicament> medicaments = user.getMedicaments();