Relacionamento Recursivo hibernate

Pessoal tenho uma classe menu que tem um autorelacionamento, até aí blz a query também funciona, o problema é que no log que eu mando exibir ele tá fazendo muitas vezes a consulta e eu queria que buscasse só id pai.
Seguem classes.

@Entity(name = "tb_menu")

public class Menu {

@Id
@Column(name = "menu_id")
private Integer menuId;

@Column(name="menu_titulo")
private String menuTitulo;

@Column(name = "menu_url")
private String menuUrl;

@Column(name = "menu_id_fk", nullable = true)
private Integer menuFk;

@OneToMany
@JoinColumn(name = "menu_id_fk")
private List<Menu> subMenus;

}

public interface MenuRepository extends JpaRepository<Menu, Integer> {

public List<Menu> findDistinctBySubMenusNotNull();

}

@Service
public class MenuService {

@Autowired
private MenuRepository menuRepository;

public List<Menu> listarMenu() {

	return menuRepository.findDistinctBySubMenusNotNull();

}

}
Log spring

2018-03-05 16:49:00.297 DEBUG 11600 — [nio-9000-exec-3] org.hibernate.SQL :
/* select
distinct generatedAlias0
from
tb_menu as generatedAlias0
left join
generatedAlias0.subMenus as generatedAlias1
where
generatedAlias1 is not null / select
distinct menu0_.menu_id as menu_id1_4_,
menu0_.menu_id_fk as menu_id_2_4_,
menu0_.menu_titulo as menu_tit3_4_,
menu0_.menu_url as menu_url4_4_
from
tb_menu menu0_
left outer join
tb_menu submenus1_
on menu0_.menu_id=submenus1_.menu_id_fk
where
submenus1_.menu_id is not null
Hibernate:
/
select
distinct generatedAlias0
from
tb_menu as generatedAlias0
left join
generatedAlias0.subMenus as generatedAlias1
where
generatedAlias1 is not null */ select
distinct menu0_.menu_id as menu_id1_4_,
menu0_.menu_id_fk as menu_id_2_4_,
menu0_.menu_titulo as menu_tit3_4_,
menu0_.menu_url as menu_url4_4_
from
tb_menu menu0_
left outer join
tb_menu submenus1_
on menu0_.menu_id=submenus1_.menu_id_fk
where
submenus1_.menu_id is not null
2018-03-05 16:49:00.299 DEBUG 11600 — [nio-9000-exec-3] org.hibernate.SQL :
select
submenus0_.menu_id_fk as menu_id_2_4_0_,
submenus0_.menu_id as menu_id1_4_0_,
submenus0_.menu_id as menu_id1_4_1_,
submenus0_.menu_id_fk as menu_id_2_4_1_,
submenus0_.menu_titulo as menu_tit3_4_1_,
submenus0_.menu_url as menu_url4_4_1_
from
tb_menu submenus0_
where
submenus0_.menu_id_fk=?
Hibernate:
select
submenus0_.menu_id_fk as menu_id_2_4_0_,
submenus0_.menu_id as menu_id1_4_0_,
submenus0_.menu_id as menu_id1_4_1_,
submenus0_.menu_id_fk as menu_id_2_4_1_,
submenus0_.menu_titulo as menu_tit3_4_1_,
submenus0_.menu_url as menu_url4_4_1_
from
tb_menu submenus0_
where
submenus0_.menu_id_fk=?
2018-03-05 16:49:00.300 DEBUG 11600 — [nio-9000-exec-3] org.hibernate.SQL :
select
submenus0_.menu_id_fk as menu_id_2_4_0_,
submenus0_.menu_id as menu_id1_4_0_,
submenus0_.menu_id as menu_id1_4_1_,
submenus0_.menu_id_fk as menu_id_2_4_1_,
submenus0_.menu_titulo as menu_tit3_4_1_,
submenus0_.menu_url as menu_url4_4_1_
from
tb_menu submenus0_
where
submenus0_.menu_id_fk=?
Hibernate:
select
submenus0_.menu_id_fk as menu_id_2_4_0_,
submenus0_.menu_id as menu_id1_4_0_,
submenus0_.menu_id as menu_id1_4_1_,
submenus0_.menu_id_fk as menu_id_2_4_1_,
submenus0_.menu_titulo as menu_tit3_4_1_,
submenus0_.menu_url as menu_url4_4_1_
from
tb_menu submenus0_
where
submenus0_.menu_id_fk=?
2018-03-05 16:49:00.302 DEBUG 11600 — [nio-9000-exec-3] org.hibernate.SQL :
select
submenus0_.menu_id_fk as menu_id_2_4_0_,
submenus0_.menu_id as menu_id1_4_0_,
submenus0_.menu_id as menu_id1_4_1_,
submenus0_.menu_id_fk as menu_id_2_4_1_,
submenus0_.menu_titulo as menu_tit3_4_1_,
submenus0_.menu_url as menu_url4_4_1_
from
tb_menu submenus0_
where
submenus0_.menu_id_fk=?
Hibernate:
select
submenus0_.menu_id_fk as menu_id_2_4_0_,
submenus0_.menu_id as menu_id1_4_0_,
submenus0_.menu_id as menu_id1_4_1_,
submenus0_.menu_id_fk as menu_id_2_4_1_,
submenus0_.menu_titulo as menu_tit3_4_1_,
submenus0_.menu_url as menu_url4_4_1_
from
tb_menu submenus0_
where
submenus0_.menu_id_fk=?
2018-03-05 16:49:00.302 DEBUG 11600 — [nio-9000-exec-3] org.hibernate.SQL :
select
submenus0_.menu_id_fk as menu_id_2_4_0_,
submenus0_.menu_id as menu_id1_4_0_,
submenus0_.menu_id as menu_id1_4_1_,
submenus0_.menu_id_fk as menu_id_2_4_1_,
submenus0_.menu_titulo as menu_tit3_4_1_,
submenus0_.menu_url as menu_url4_4_1_
from
tb_menu submenus0_
where
submenus0_.menu_id_fk=?
Hibernate:
select
submenus0_.menu_id_fk as menu_id_2_4_0_,
submenus0_.menu_id as menu_id1_4_0_,
submenus0_.menu_id as menu_id1_4_1_,
submenus0_.menu_id_fk as menu_id_2_4_1_,
submenus0_.menu_titulo as menu_tit3_4_1_,
submenus0_.menu_url as menu_url4_4_1_
from
tb_menu submenus0_
where
submenus0_.menu_id_fk=?
2018-03-05 16:49:00.303 DEBUG 11600 — [nio-9000-exec-3] org.hibernate.SQL :
select
submenus0_.menu_id_fk as menu_id_2_4_0_,
submenus0_.menu_id as menu_id1_4_0_,
submenus0_.menu_id as menu_id1_4_1_,
submenus0_.menu_id_fk as menu_id_2_4_1_,
submenus0_.menu_titulo as menu_tit3_4_1_,
submenus0_.menu_url as menu_url4_4_1_
from
tb_menu submenus0_
where
submenus0_.menu_id_fk=?
Hibernate:
select
submenus0_.menu_id_fk as menu_id_2_4_0_,
submenus0_.menu_id as menu_id1_4_0_,
submenus0_.menu_id as menu_id1_4_1_,
submenus0_.menu_id_fk as menu_id_2_4_1_,
submenus0_.menu_titulo as menu_tit3_4_1_,
submenus0_.menu_url as menu_url4_4_1_
from
tb_menu submenus0_
where
submenus0_.menu_id_fk=?
2018-03-05 16:49:00.303 DEBUG 11600 — [nio-9000-exec-3] org.hibernate.SQL :
select
submenus0_.menu_id_fk as menu_id_2_4_0_,
submenus0_.menu_id as menu_id1_4_0_,
submenus0_.menu_id as menu_id1_4_1_,
submenus0_.menu_id_fk as menu_id_2_4_1_,
submenus0_.menu_titulo as menu_tit3_4_1_,
submenus0_.menu_url as menu_url4_4_1_
from
tb_menu submenus0_
where
submenus0_.menu_id_fk=?
Hibernate:
select
submenus0_.menu_id_fk as menu_id_2_4_0_,
submenus0_.menu_id as menu_id1_4_0_,
submenus0_.menu_id as menu_id1_4_1_,
submenus0_.menu_id_fk as menu_id_2_4_1_,
submenus0_.menu_titulo as menu_tit3_4_1_,
submenus0_.menu_url as menu_url4_4_1_
from
tb_menu submenus0_
where
submenus0_.menu_id_fk=?

Usa hql/jpql.

Eu posso até fazer isso, mas eu gostaria de entender o porquê de não estar rolando do jeito que deveria estar, se é erro meu ou o que.

Então posta como está fazendo essa consulta.

Tá tudo aí, só falta a chamada do controller mas é só.
@GetMapping
public ResponseEntity<List> listarMenu(){
return new ResponseEntity<List>(menuService.listarMenu(),HttpStatus.OK);
}

Isso não é a consulta. Mostra o código onde você faz a busca pelo Hibernate.

public interface MenuRepository extends JpaRepository<Menu, Integer> {

public List findDistinctBySubMenusNotNull();
}
Esse código é a consulta, JPARepository que implenta CrudRepository.
A query é gerada pelo hibernate.

Isso é só a assinatura do método. O que findDistinctBySubMenusNotNull faz()?

Man você conhece springdata?
https://docs.spring.io/spring-data/jpa/docs/2.0.5.RELEASE/reference/html/#repositories.query-methods.query-creation

Ele está usando SpringData que, basicamente, faz a implementação “por baixo dos panos”.
Via de regra, ele faz um

SELECT DISTINCT m FROM Menu m WHERE m.subMenu IS NOT NULL;

Com uma ou outra variação, dependendo do mapeamento.

Justamente isso e no caso depois ele faz os selects da lista mas ele percorre todos os resultados do banco e a intenção seria que ele só percorresse o que veio no primeiro select.

Não conheço. Quando for assim especifica o que está usando. Só sei que com Hibernate você pode ter o controle disso com hql/jqpl, ou melhor ainda, com SQL. Com soluções mágicas vai penar mesmo.

Eu fiquei bastante confuso quando comecei a mexer com Spring Data. Mas, é fácil notar que a tecnologia foi desenvolvida para os casos mais corriqueiros, cruds simples e sem muita firula. qualquer coisa além disso, é melhor usar JDBC puro.

Tá especificado no código postado man escrito JpaRepository e eu expliquei, agora você não conhecer já são outros 500. Fora o link que eu enviei.

Mas é coisa simples, relacionamento normal, funciona, eu só queria entender o porquê da query repetir várias vezes.

Não conheço, só tentei te ajudar a chegar no problema, mas como você só tem acesso a assinatura de um método mágico fica difícil. Procure usar formas mais profissionais.

Que você tentou ajudar eu sei e agradeço.
“Procure usar formas mais profissionais” Você está dizendo que usar um recurso do framework não é profissional?

Qualquer recurso via framework ou não, portanto que não gere multiplas queries sem necessidade, o que afeta o desempenho.

Uma funcionalidade do framework desenvolvida por caras que provavelmente conhecem MUITO mais que eu me levam a crer que estou cometendo um erro (tendo em vista estamos falando dos desenvolvedores do spring e tudo que fazem é otimizar e não piorar as coisas) e é isso que queria ter certeza quando fiz o pedido de ajuda.
Tem um monte de asno por aí que não sabe usar certas ferramentas e dizem que elas não prestam (vide hibernate entre outras) e como não é meu caso gostaria de saber se estava cometendo um erro ou se os caras que eu acredito conhecerem mais do que eu fizeram merda mesmo.

A sugestão que te passei (hql/jpql) é usando o próprio hibernate.