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

Java JPA存储库选择不带关系实体,java,spring,hibernate,jpa,jpql,Java,Spring,Hibernate,Jpa,Jpql,我有两个具有关系的实体(hibernate)。当我通过JPA repository获取实体时,然后休眠对两个实体进行“选择”。如何通过一次选择获得实体(此时我不需要第二个实体) 对不起,我的英语和技术语言-我是初学者 编辑 用户: @Entity public class User { @Id @GeneratedValue private int id; private String name; @OneToMany(mappedBy = "user", fetch = FetchTyp

我有两个具有关系的实体(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
}
我从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);
}
public interface UserRepository扩展了JpaRepository{
@查询(“从用户u中选择u,其中name=:name”)
用户findByNameQuery(@Param(“name”)字符串名);
用户findByName(字符串名称);
}
方法
findByNameQuery
findByName
都会进行多次选择

更改

@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
private List<Medicament> medicaments;
@OneToMany(mappedBy=“user”,fetch=FetchType.EAGER)
私人上市药物;

@OneToMany(mappedBy=“user”,fetch=FetchType.LAZY)
私人上市药物;

或者根本不指定FetchType。
@OneToMany
@ManyToMany
的默认值是
懒惰
渴望
,对于
@onetomone

@Tomas Kralik它正在工作!谢谢

你能告诉我什么更好用吗

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

User user = userRepository.findByName(name);
List<Medicament> medicaments = medicamentRepository.findByUser(user);
和实体用户具有抓取延迟,在我使用的控制器中:

User user = userService.findByName(name);
List<Medicament> medicaments = user.getMedicaments();
User=userService.findByName(名称);
列表药物=user.getMedicaments();

如果您使用的是Criteria api,您可以使用
setFetchMode(FetchMode.LAZY)
,还可以在关系注释中指定
fetch=FetchType.LAZY
发布这些实体的代码i添加的实体@Pragnani Kinnera如何在代码中使用setFetchMode?@pragnanikinera
标准api您可以使用setFetchMode(FetchMode.LAZY)
。我认为这是行不通的。反之亦然。我们可以在实体映射中将一个关系定义为惰性的,并且使用条件,我们可以使用
FetchMode.EAGER
使它急切地获取。但一旦我们在实体映射本身中将其指定为EAGER,就不能使用条件或HQL将其加载为LAZY来更改它。你可能想试试。很高兴你成功了。当你想对某人的答案做出反应时,请使用评论。当然可以使用第二个代码段,您可以使用getter来获取相关的实体-这就是JPA的魅力:)无论您使用的是
LAZY
还是
EAGER
,都没有关系。唯一的区别是运行“第二个”查询的时间。当您使用
EAGER
时,会立即查找所有相关的实体。如果使用
LAZY
加载,则在访问属性/getter时会查找相关的实体。如果此答案对您有帮助,请将其标记为已接受:)您甚至不必在查询中使用
JOIN
,因为您已经获得了使用注释指定的关系。Hibernate做所有的工作。简单的
@Query(“从用户u中选择u,其中u.name=:name”)
应该这样做
User user = userRepository.findByName(name);
List<Medicament> medicaments = medicamentRepository.findByUser(user);
User user = userRepository.findByName(name);
List<Medicament> medicaments = user.getMedicaments();
@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();