Java FETCHTMODE Subselect未在集合属性上运行

Java FETCHTMODE Subselect未在集合属性上运行,java,sql,hibernate,jpa,Java,Sql,Hibernate,Jpa,我的类有一个集合属性,它用@Fetch(value=FetchMode.SUBSELECT)标记。但它仍然使用不同的查询加载属性,而不是仅使用subselect加载属性 @实体 @表(name=“NPRO\u USUARIOS”) 公共类用户实现可序列化{ //方法和心房抑制 @ManyToMany(cascade={CascadeType.ALL}) @JoinTable(name=“NPRO\u USUARIOS\u area”,joinColumns=@JoinColumn(name=“i

我的类有一个
集合属性,它用
@Fetch(value=FetchMode.SUBSELECT)
标记。但它仍然使用不同的查询加载属性,而不是仅使用subselect加载属性

@实体
@表(name=“NPRO\u USUARIOS”)
公共类用户实现可序列化{
//方法和心房抑制
@ManyToMany(cascade={CascadeType.ALL})
@JoinTable(name=“NPRO\u USUARIOS\u area”,joinColumns=@JoinColumn(name=“id\u usuario”),inverseJoinColumns=@JoinColumn(name=“id\u area”))
@Fetch(值=FetchMode.SUBSELECT)
私人设置的列表区域;
// ...
}
这是日志:

Hibernate: select user0_.id_usuario as id_usuario1_22_0_, user0_.activo as activo2_22_0_, user0_.email_usuario as email_usuario3_22_0_, user0_.fecha_ultimo_acceso as fecha_ultimo_acces4_22_0_, user0_.matricula_usuario as matricula_usuario5_22_0_, user0_.nombre_usuario as nombre_usuario6_22_0_, user0_.observaciones as observaciones7_22_0_, user0_.usuario_modif as usuario_modif8_22_0_, user1_.id_usuario as id_usuario1_22_1_, user1_.activo as activo2_22_1_, user1_.email_usuario as email_usuario3_22_1_, user1_.fecha_ultimo_acceso as fecha_ultimo_acces4_22_1_, user1_.matricula_usuario as matricula_usuario5_22_1_, user1_.nombre_usuario as nombre_usuario6_22_1_, user1_.observaciones as observaciones7_22_1_, user1_.usuario_modif as usuario_modif8_22_1_ from npro_usuarios user0_ left outer join npro_usuarios user1_ on user0_.usuario_modif=user1_.id_usuario where user0_.id_usuario=?

Hibernate: select listareas0_.id_usuario as id_usuario1_23_0_, listareas0_.id_area as id_area2_23_0_, area1_.id_area as id_area1_5_1_, area1_.activo as activo2_5_1_, area1_.clase_doc_telesap as clase_doc_telesap3_5_1_, area1_.fecha_modif as fecha_modif4_5_1_, area1_.nombre_area as nombre_area5_5_1_, area1_.observaciones as observaciones6_5_1_, area1_.id_sociedad as id_sociedad8_5_1_, area1_.tipo_dato as tipo_dato7_5_1_, area1_.usuario_modif as usuario_modif9_5_1_ from npro_usuarios_areas listareas0_ inner join npro_maestro_areas area1_ on listareas0_.id_area=area1_.id_area where listareas0_.id_usuario=?

你知道为什么不只是执行一个查询吗?

那么你对
用户的主要查询就是你一直拥有的查询。当您使用
SUBSELECT
fetching时,它将触发一个额外的查询。如果您使用的是
SELECT
,它将为您获取的每N个
User
对象触发一个查询,其中N是批大小。如果您只获取一个用户(看起来是这样),那么您还可以使用
SELECT
,这将生成一个类似的查询


区别在于,
SELECT
查询将按所有者id进行查询,而
SUBSELECT
查询将原始查询嵌入查询以获取集合。根据原始查询的复杂程度,最好使用具有适当批量大小的
SELECT
,以避免再次执行复杂的查询部分。但这些性能方面必须逐个考虑。

我不是专家,这似乎是预期行为。您可能会看到。不,正如您在链接中所看到的,预期的行为是使用子查询执行一次查询,而不是n+1查询。它的意思是
SUBSELECT生成一个查询以加载客户,另外一个查询以获取所有发票收款