Java JPA存储库选择不带关系实体
我有两个具有关系的实体(hibernate)。当我通过JPA repository获取实体时,然后休眠对两个实体进行“选择”。如何通过一次选择获得实体(此时我不需要第二个实体) 对不起,我的英语和技术语言-我是初学者 编辑 用户: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
@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();