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

在hibernate(springboot)中编写带有左联接和分页的sql本机查询[duplicate]

水浩歌
2023-03-14

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

我有一个下面的SQL查询(注意左边的连接):

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;

我想在我的机构存储库中执行它,如下所示:

@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设置为1,用于表示目的)

我看过很多这样的问题和答案(比如这一个),但我还没能找到答案。

那么,我如何编写这个查询,以便得到我想要的东西呢?

@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:您的SQL语法中有错误;查看与您的MySQL server版本相对应的手册,了解第2行“WHERE)FROM building_institutionswhere building_institutions.building_id=1)a'附近使用的正确语法

@Stanislavl这里是:

问题是,您的查询给我的是ID为25的机构,因为它同时位于ID为1的大楼和ID为2的大楼中。当您执行连接时,在institution表和building_institutions表中都有2行InstitutionID为25的行。然后,您的WHERE条件从这两行中删除了一个,我得到了其中一行的instituiton ID是25,而我不想要what。

下面是上面的图像:

  • 我的查询是带分页(我在问题标题中添加了“带分页”)
  • 我使用的不是@namedquery而是@query
  • 我的错误是没有将countQuery参数写入@query注释

共有1个答案

孙岳
2023-03-14

我解决了...

查询需要如下所示:

@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);

当我的查询如下所示时,我在第4行靠近WHERE的地方得到了错误:

@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);

我希望我能让别人免于几个小时的痛苦。

干杯!:)

 类似资料:
  • 我有一个sql查询: 这就产生了: Hibernate:选择this_.pName为y0_,this_.kNum为y1_,count(distinct this_.agentg)为y2_from Test_CPView this_where(低(this_.pName+“~”+this_.kNum)like?或低(this_.pName+“~”+this_.kNum)like?或低(this_.p

  • 问题内容: 我正在尝试创建一个更新查询,并且在获取正确的语法方面进展甚微。以下查询正在运行: 它创建一个三元组的列表Index1,Index2,EventCounts。仅在t.SpecialEventCount为NULL的情况下才这样做。我尝试编写的更新查询应将此SpecialEventCount设置为该计数,即上述查询中的COUNT(m.EventType)。此数字可以是0或任何正数(因此为左联

  • 问题内容: 在一个网络项目中,将最新的spring-data(1.10.2)与MySQL 5.6数据库一起使用,我试图将本机查询与分页一起使用,但是在启动时遇到了问题。 根据spring-data文档中使用的示例50,可以指定查询本身和countQuery,如下所示: 出于好奇,在课堂上我可以看到它包含以下代码来检查其是否为有效的jpa查询: 我的查询中包含一个参数,所以是的,但它也在寻找或序列里

  • 在一个web项目中,使用最新的spring-data(1.10.2)和MySQL5.6数据库,我试图使用带分页的本机查询,但在启动时遇到的是。 根据示例50,在使用来自spring-data文档的@query时,可以指定查询本身和countQuery,如下所示: 出于好奇,在类中,我可以看到它包含以下代码,以检查它是否是有效的jpa查询: 我的查询包含一个参数,因此是,但它也在中查找一个或序列,我

  • 我需要从中选择所有行,如果选择位置子句匹配,则从中选择匹配这是我的外部与子查询,但它失败了。有人可以帮忙吗?

  • 我有一个关于Hibernate ManyToOne协会的问题。 我有一个产品实体映射如下: 所以你怎么能看到我们与ProductClass表的关系。和FK我们存储在产品表中。当我创建查询,选择产品的特定类别和价格我有下一个this_: 我接下来的问题是:如何避免Product和ProductCategory这两个表的内部联接? 我的标准DAO代码:<代码>标准。createAlias(“类别”、“