我使用SpringBoot(v2.0)JPA和hibernate(v5.4)。我有3个实体类LaunchGrossSalesBasis,它连接到LaunchModel和LaunchVersionModel。
@Entity
@Data
public class LaunchGrossSalesBasis {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "launch_id")
private LaunchModel launchModel;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "version_id")
private LaunchModelVersion launchModelVersion;
...
}
@Entity
@Data
@NoArgsConstructor
public class LaunchModel {
...
Integer id;
// Unidirectional - so no mapping in this class
...
}
@Entity
@Data
@NoArgsConstructor
public class LaunchVersionModel {
...
Integer id;
// Unidirectional - so no mapping in this class
...
}
public interface LaunchGrossSalesBasisRepository extends BaseCrudRepository<LaunchGrossSalesBasis, Integer> {
//working but no effect
//@Query("SELECT l FROM LaunchGrossSalesBasis l INNER JOIN l.launchModelVersion v INNER JOIN l.launchModel m WHERE v.id = ?1 AND m.id=?2")
@Query(value="select * from launch_gross_sales_basis s inner join launch_model m ON s.launch_id = m.id INNER JOIN launch_model_version v ON s.version_id = v.id where s.version_id =?1 and s.launch_id=?2 ", nativeQuery = true)
LaunchGrossSalesBasis findByVersionIdAndLaunchId(Integer versionId, Integer launchId);
...
}
字符串
当我从服务层调用findByVersionIdAndLaunchId(versionId,launchId)时,我期望只有一个查询,但我总是得到3个查询。
Hibernate: select * from launch_gross_sales_basis s inner join launch_model m ON s.launch_id = m.id INNER JOIN launch_model_version v ON s.version_id = v.id where s.version_id =? and s.launch_id=?
Hibernate: select launchmode0_.id as id1_52_0_, ... from launch_model launchmode0_ where launchmode0_.id=?
Hibernate: select launchmode0_.id as id1_57_0_, ... from launch_model_version launchmode0_ where launchmode0_.id=?
型
我尝试了许多不同的方法(包括原生),但我总是得到3个查询。我错过了什么?像这样,我有更多的查询,hibernate为一个复杂的函数触发了200多个查询。
任何线索都会很有帮助。先谢谢你了。
1条答案
按热度按时间htrmnn0y1#
这些额外的请求显然来自实体的lazy字段。您在请求中提到了它们,但Hibernate仍然会延迟加载它们。如果您想在请求中加载它们-将
fetch
添加到您的joins中。如果你不使用惰性字段,但想知道为什么Hibernate加载它们-我想答案是因为Lombok的
@Data
注解。它创建了使用字段的equals/hashcode方法。尝试将其替换为@Getter
+@Setter
。关于这种情况的更多信息,你可以在this article中找到。