Fil*_*vic 7 java mysql sql spring spring-data-jpa
我正在使用 spring 数据 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;
Run Code Online (Sandbox Code Playgroud)
我想在我的 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);
}
Run Code Online (Sandbox Code Playgroud)
所以,我想用特定的 ID(我将其作为参数发送)获取所有不在建筑物中的机构。
机构:
建设机构:
我想要什么:(在此查询中,id 设置为 1,用于演示目的)
我查看了许多 SO 问题和答案(例如这个),但我一直无法找出解决方案。
那么,我该如何编写这个查询才能得到我想要的呢?
@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);
Run Code Online (Sandbox Code Playgroud)
我得到这个例外:
MySQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在第 2 行的 'WHERE) FROM building_institutions WHERE building_institutions.building_id = 1) A' 附近使用的正确语法
@StanislavL 在这里:
问题是您的查询让我得到了 ID 为 25 的机构,因为它同时位于 ID 为 1 的建筑物和 ID 为 2 的建筑物中。当您执行 JOIN 时,机构表和 building_institutions 表中有 2 行 ON 机构 ID 均为 25 . 然后,您的 WHERE 条件从这两行中删除了一个,我得到了一行,其中机构 ID 为 25,而我不想要什么。
这是上面的图像:
@NamedQuery但是@Query@Query注释中写入 countQuery 参数我解决了...
查询需要如下所示:
@Query(
value = "SELECT * FROM \n" +
"(institution INNER JOIN user ON institution.user_id = user.id) \n" +
"LEFT JOIN \n" +
"(SELECT * FROM \n" +
"building_institutions \n" +
"WHERE building_id = :userId)\n" +
" AS reserved_institutions \n" +
"ON reserved_institutions.institutions_user_id = kits_nwt.institution.user_id \n" +
" where reserved_institutions.institutions_user_id IS null \n"
+ "ORDER BY ?#{#pageable}"
,
countQuery = "SELECT count(*) FROM \n" +
"(institution INNER JOIN user ON institution.user_id = user.id) \n" +
"LEFT JOIN \n" +
"(SELECT * FROM \n" +
"building_institutions \n" +
"WHERE building_id =:userId)\n" +
" AS reserved_institutions \n" +
"ON reserved_institutions.institutions_user_id = kits_nwt.institution.user_id \n" +
"where reserved_institutions.institutions_user_id IS null \n" +
"ORDER BY ?#{#pageable}",
nativeQuery = true)
Page<Institution> findPotentialInstitutionsByBuildingId(@Param("userId") Long userId, Pageable pageable);
Run Code Online (Sandbox Code Playgroud)
当我的查询如下所示时,我在 WHERE 附近的第 4 行收到错误消息:
@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);
Run Code Online (Sandbox Code Playgroud)
那是因为我没有将countQuery参数添加到@Query注释中。
非常感谢所有试图提供帮助的人。
我希望我能拯救别人许多小时的痛苦。
干杯! :)
| 归档时间: |
|
| 查看次数: |
5170 次 |
| 最近记录: |