当前位置: 首页 > 知识库问答 >
问题:

多对多用左连接发送两个查询[重复]

范翰飞
2023-03-14

我的实体是用户和角色。它们之间存在着多对多的关系。角色的获取在用户中是惰性的。

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "users_roles",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
@BatchSize(size = 3)
private Set<Role> roles = new HashSet<>();

我想在一个查询中得到用户和规则数据。所以我试着用JPQL得到这些数据。我的用户库是

@Query(value = "select u from User u left join u.roles where u.username=:username")
Optional<User> findByUserNameWithRoles(@Param("username") String username);

我记录我的查询与数据源代理,我有两个查询,但我没有离开加入一个查询。为什么不做一个查询?

我的日志是

Name:Db Connection, Connection:4, Time:1, Success:True
Type:Prepared, Batch:False, QuerySize:1, BatchSize:0
Query:["select user0_.id as id1_1_, user0_.created_by as created_2_1_, user0_.created_date as created_3_1_, user0_.last_modified_by as last_mod4_1_, user0_.last_modified_date as last_mod5_1_, user0_.email as email6_1_, user0_.first_name as first_na7_1_, user0_.password as password8_1_, user0_.status as status9_1_, user0_.surname as surname10_1_, user0_.user_uuid as user_uu11_1_, user0_.username as usernam12_1_ from users user0_ left outer join users_roles roles1_ on user0_.id=roles1_.user_id left outer join roles role2_ on roles1_.role_id=role2_.id where user0_.username=?"]
Params:[(yusuf)] 
- 

Name:Db Connection, Connection:4, Time:1, Success:True
Type:Prepared, Batch:False, QuerySize:1, BatchSize:0
Query:["select roles0_.user_id as user_id1_2_1_, roles0_.role_id as role_id2_2_1_, role1_.id as id1_0_0_, role1_.role_name as role_nam2_0_0_ from users_roles roles0_ inner join roles role1_ on roles0_.role_id=role1_.id where roles0_.user_id=?"]
Params:[(1)]

共有1个答案

姜玉泽
2023-03-14

第一个查询用于收集有关用户的信息。第二个查询是获取链接到该用户的所有角色。这就是所谓的n1ORM问题,你可以在这里和这里阅读

解决方案是使用join-fetch而不是left-join

 类似资料:
  • 我有2个具有多对多关系的实体User和AcCountBase。我需要从连接表中选择所有具有选定用户ID的AcCountBase对象。我尝试了一些连接查询,但不起作用。

  • 问题内容: 我有一个NewsStories表格,剩下一些相关表格。每个新闻故事可以具有多个图像,类别和地址。因此查询实质上是: 通常每个故事有一些图像和地址,以及1或2个类别。NewsStories表包含大约10,000条文章。 问题在于性能相当慢(大约15-20秒,尽管它的确变化很大,有时甚至低至5秒)。 我想知道是否有更好的方法来组织查询以加快查询速度(我对SQL还是很陌生)。 尤其是,给定故

  • 我有两个域对象,如下所示 使用者Java语言 产品Java语言 在这种情况下,用户到产品具有多对一关系。多个用户可以订阅同一产品。我想通过连接这两个表来查询User表中的用户电子邮件ID,其中productId是产品表中的主键,foriegn键是User表中的foriegn键...如何使用Hibernate查询语言或标准通过连接这两个表来做到这一点?

  • 我需要连接来自两个不同表的数据,如下所示。仅使用一个sql查询就可以做到这一点吗?如果“key”和“name”在两个表上,那么它们是相同的。表1中的“状态”始终为“-”,表2中的“T”。此外,两个表上的“名称”和“comp”都匹配(例如:Name3-C和Name4-B)<我尝试过“联合”和“加入”,但还没有解决办法! 表1 表2 结果应该是。。。 提前谢谢!

  • 我有两个表与1:1的关系,我使用内容提供者和CursorLoader。 如何使连接查询与游标加载器一起工作?我可以用内容提供程序中的rawSql来黑它,但如何在游标加载器构造函数中做就不是我能做到的了。 多谢!

  • 我想管理与映射到联接表的实体的关系。因此我有3个实体类:、、。具有注释的和成员。 及其嵌入的密钥: 当我需要带有给定标记的帖子时,我希望使用以下查询: 整件事都在这里: https://github.com/riskop/jpa_hibernate_spring_boot_many_to_many_managed_on_join_table_problem