gpt4 book ai didi

java - 在 hibernate (springboot)中使用左连接和分页编写 sql native 查询

转载 作者:可可西里 更新时间:2023-11-01 08:24:17 26 4
gpt4 key购买 nike

<分区>

我正在使用 spring data JPA,我想在我的存储库中编写一个 SQL 查询。

我有以下 SQL 查询(注意 LEFT JOIN):

SELECT * FROM institution LEFT JOIN 
(select * from building_institutions where building_institutions.building_id = 1) as reserved_institutions
ON reserved_institutions.institutions_user_id = institution.user_id
WHERE reserved_institutions.institutions_user_id is null;

我想在我的 InstitutionRepository 中执行它,如下所示:

@Repository
public interface InstitutionRepository extends JpaRepository<Institution, Long>, PagingAndSortingRepository<Institution,Long> {
// doesn't work
//@Query("SELECT b.institutions as bi FROM Building b left join Institution i WHERE bi.building_id not in :id")
Page<Institution> findPotentialInstitutionsByBuildingId(@Param("id") Collection<Long> id, Pageable pageable);

// doesn't work
@Query(
value = "SELECT * FROM kits_nwt.institution LEFT JOIN\n" +
"(SELECT * FROM kits_nwt.building_institutions WHERE kits_nwt.building_institutions.building_id = ?1) AS reserved_institutions\n" +
"ON reserved_institutions.institutions_user_id = kits_nwt.institution.user_id\n" +
"WHERE reserved_institutions.institutions_user_id IS null ORDER BY ?#{#pageable}",
nativeQuery = true)
Page<Institution> findPotentialInstitutionsByBuildingId(Long userId, Pageable pageable);
}

所以,我想让所有不在建筑物中的机构都具有特定 ID(我将作为参数发送)。

这是我当前的数据库数据:

机构:

Institutions

建立机构:

Building institutions

我想要的:(在此查询中,id 设置为 1,用于演示目的)

What I want

我看过很多 SO 问题和答案(例如 this one ),但我一直无法找出解决方案。

那么,我该如何编写这个查询才能得到我想要的呢?

编辑 1:

@KevinAnderson 目前,我正在尝试:

@Query(
value = "SELECT username, password, description, location, title, user_id FROM (institution INNER JOIN user ON institution.user_id = user.id) LEFT JOIN\n" +
"(SELECT * FROM building_institutions WHERE building_institutions.building_id = 1) AS reserved_institutions\n" +
"ON reserved_institutions.institutions_user_id = kits_nwt.institution.user_id\n" +
"WHERE reserved_institutions.institutions_user_id IS null ORDER BY ?#{#pageable}",
nativeQuery = true)
Page<Institution> findPotentialInstitutionsByBuildingId(Long userId, Pageable pageable);

我遇到了这个异常:

MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE) FROM building_institutions WHERE building_institutions.building_id = 1) A' at line 2

编辑2:

@StanislavL 在这里:

enter image description here

问题是您的查询为我提供了 ID 为 25 的机构,因为它在 ID 为 1 的建筑物和 ID 为 2 的建筑物中。当您执行 JOIN 时,两个机构表中的机构 ID 为 25 的行有 2 行和 building_institutions 表。然后,您的 WHERE 条件从这两行中删除了一行,我得到了机构 ID 为 25 的一行,我不想要什么。

这是上面的图片:

Join without WHERE

编辑 3 - 由于以下原因,此问题不重复:

  • 我的查询是带分页的(我在问题标题中添加了“带分页”)
  • 我没有使用 @NamedQuery,而是使用 @Query
  • 我的错误是我没有在@Query注解中写countQuery参数

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com