在Eclipse中有一个"强制返回"功能,它允许从方法调用返回任何选定的对象.IntelliJ IDEA中是否有这样的功能?
我在合理的时间内使用DB完全加载非常复杂的对象并且查询数量合理.
我的对象有很多嵌入式实体,每个实体都引用另一个实体,另一个实体引用另一个实体等等(所以,嵌套级别为6)
所以,我已经创建了一个示例来演示我想要的内容:https: //github.com/gladorange/hibernate-lazy-loading
我有用户.
用户拥有@OneToMany最喜欢的橘子,苹果,葡萄藤和桃子的集合.每个Grapevine都有@OneToMany葡萄收藏.每个水果都是另一个只有一个String字段的实体.
我正在创造用户,每种类型有30种最喜欢的水果,每种葡萄都有10种葡萄.所以,我在DB中有421个实体--30*4个水果,100*30个葡萄和一个用户.
我想要的是:我想使用不超过6个SQL查询加载它们.并且每个查询不应该产生大的结果集(对于该示例,大的结果集具有超过200个记录).
我理想的解决方案如下:
6个要求.第一个请求返回有关用户的信息,结果集的大小为1.
关于该用户的苹果的第二个请求返回信息和结果集的大小是30.
第三,第四和第五个请求返回相同,第二个(结果集大小= 30),但对于Grapevines,Oranges和Peaches.
第六个请求返回所有葡萄藤的葡萄
这在SQL世界中非常简单,但我无法用JPA(Hibernate)实现这一点.
我尝试了以下方法:
使用fetch join,就像from User u join fetch u.oranges ....这太糟糕了.结果集为30*30*30*30,执行时间为10秒.请求数量= 3.我尝试没有葡萄,葡萄你会得到x10大小的结果集.
只需使用延迟加载.这是此示例中的最佳结果(对于葡萄,@ Fetch = SUBSELECT).但在这种情况下,我需要手动迭代每个元素集合.此外,subselect fetch太全局设置,所以我想有一些可以在查询级别工作的东西.结果集和时间接近理想.6个查询和43毫秒.
加载实体图.与获取连接相同,但它也要求每种葡萄都能获得葡萄藤.但是,结果时间更好(6秒),但仍然很糟糕.请求数> 30.
我试图在单独的查询中用"手动"加载实体来欺骗JPA.喜欢:
SELECT u FROM User where id=1; SELECT a FROM Apple where a.user_id=1;
延迟加载有点糟糕,因为每个集合需要两个查询:第一个查询到手动加载实体(我完全控制这个查询,包括加载相关实体),第二个查询延迟加载相同的实体由Hibernate本身(这是由Hibernate自动执行)
执行时间为52,查询数量= 10(用户为1,葡萄为1,每个水果收集为4*2)
实际上,结合SUBSELECT fetch的"手动"解决方案允许我使用"简单"的获取连接来在一个查询中加载必要的实体(比如@OneToOne实体)所以我将使用它.但我不喜欢我必须执行两个查询来加载集合.
有什么建议?