Java 在Spring Boot@Query中使用一组实体查询实体时出现问题

Java 在Spring Boot@Query中使用一组实体查询实体时出现问题,java,sql,spring-boot,spring-data-jpa,Java,Sql,Spring Boot,Spring Data Jpa,我想在JpaRepository中有一个Spring Boot@Query,它返回我的实体和一组其他实体。我知道我可以使用findAll()方法,然后只获取我感兴趣的行,但我认为这要慢得多。问题是我的实体Boost包含其他实体Boost的Set,当我试图查询它时,我得到一个错误。这是我的查询: @Query( "select new app.model.Booster(" + " B.id, " +

我想在JpaRepository中有一个Spring Boot
@Query
,它返回我的实体和一组其他实体。我知道我可以使用
findAll()
方法,然后只获取我感兴趣的行,但我认为这要慢得多。问题是我的实体
Boost
包含其他实体
Boost
Set
,当我试图查询它时,我得到一个错误。这是我的
查询

    @Query( "select new app.model.Booster(" +
            "   B.id, " +
            "   B.active, " +
            "   B.games, " +
            "   B.ownerAccount, " +
            "   B.boosts, " +
            "   B.boosterNickname, " +
            "   B.additionalInformation) " +
            "from " +
            "   Booster B " +
            "   left join Boost Bo on B.id = Bo.boostingAccount.id " +
            "where " +
            "   B.games like %?1% " +
            "   and Bo.finished = true " +
            "group by " +
            "   B.id")
    List<Booster> findBoostersForOverview(String game);
这就是我得到的错误:
java.sql.SQLSyntaxErrorException:您的sql语法有错误;查看与您的MySQL服务器版本对应的手册,以了解使用near'的正确语法。作为第4列0,增压器0。增压器1行的昵称为第5列0,增压器0。附加信息

我知道我可以查询,而不必设置
Boost
Set
,然后在另一个查询中获得特定的
Boost
s,但是在我的应用程序中会有很多SQL,我的代码会变成意大利面。有什么简单的方法可以解决我的问题吗?

这里的问题是,您使用的是
分组方式。使用“分组依据”
时,您可以使用聚合函数
(计数、最大值、最小值、总和、平均值)
按选择列中的一列或多列对结果集进行分组。使用
groupby
函数时,聚合函数是必需的

在您的情况下,我希望不需要
groupby
。如下所示修改代码

@Query( "select new app.model.Booster(" +
        "   B.id, " +
        "   B.active, " +
        "   B.games, " +
        "   B.ownerAccount, " +
        "   B.boosts, " +
        "   B.boosterNickname, " +
        "   B.additionalInformation) " +
        "from " +
        "   Booster B " +
        "   left join Boost Bo on B.id = Bo.boostingAccount.id " +
        "where " +
        "   B.games like %?1% " +
        "   and Bo.finished = true")
List<Booster> findBoostersForOverview(String game);
@Query(“选择新的app.model.Booster(”+
“B.id,”+
“B.主动的,”+
“B.游戏,”+
B.所有者帐户+
“B.促进,”+
“B.boosterNickname,”+
“B.补充资料”+
“来自”+
“助推器B”+
“在B.id=Bo.boostingcount.id上左键加入Boost Bo”+
“哪里”+
“B.像%?1%这样的游戏”+
“和Bo.finished=true”)
列出FindBoostersForverView(弦乐游戏);

您是否可以将以下内容添加到您的存储库而不添加任何
@Query
注释并查看

    List<Booster> findByGamesLikeAndBoostsFinishedIsTrue(String game);
List finishedbegameslikeand boostsfinishedistrue(字符串游戏);

使用分组依据时,聚合函数不是必需的。按a、b、c从某个_表组中选择a、b、c;这是从某张桌子上得到所有独特的a、b和c组合的一种非常正常的方式。啊,你说得对。在我从以前的查询版本更改此查询后,忘记删除此行。问题是,即使我对代码进行了更改,错误仍然会发生。哎呀!不管怎样,你有办法了!我很高兴,兄弟。
Boost
Boost
实体相关吗?如果是这样,您可以将
Boost
实体类添加到您的问题中吗?类
app.model.Booster
和正在保存的
Booster
之间是否存在差异?@KavithakaranKanapathippillai在代码中添加了实体类。我不明白你所说的“app.model.Booster类和正在保存的Booster类之间有什么区别?”是什么意思,但是没有其他类Booster,taht app.model.Booster。我完全忘记了,JPA中的查询可以这样创建。它工作,但不是我想要的工作方式。它多次返回同一个助推器,因为助推器有一组助推器,每次它找到一个完成的属于给定助推器的助推器时,它都返回它。有没有办法返回一个只完成了一次助推器的助推器,或者我必须在BoostserService中手动执行int?上面的查询是为了
返回至少完成了一次助推器的助推器。您的要求不同吗?如果是,,是1)
返回所有助推器都完成的助推器吗?
2)
返回任何助推器,其中至少有一个助推器完成,但当返回该助推器时,从它的子项中移除任何其他未完成的助推器。
?我想得到的一个查询是
返回给定游戏中所有完成的助推器Boost
。因此,如果给定游戏的助推器有一些未完成的助推器,您不希望它们包含在
助推器中。getBoosts()
?对于此特定查询-是。我想知道,我是否得到了
Boost
的整个
Set
,然后删除了一个未完成的,或者是否有办法通过查询来完成。
Hibernate: 
    select
        booster0_.id as col_0_0_,
        booster0_.active as col_1_0_,
        booster0_.games as col_2_0_,
        booster0_.id as col_3_0_,
        . as col_4_0_,
        booster0_.booster_nickname as col_5_0_,
        booster0_.additional_information as col_6_0_ 
    from
        booster booster0_ 
    //HERE IS SOME MORE LOGS THAT ARE UNNECESSARY HERE
@Query( "select new app.model.Booster(" +
        "   B.id, " +
        "   B.active, " +
        "   B.games, " +
        "   B.ownerAccount, " +
        "   B.boosts, " +
        "   B.boosterNickname, " +
        "   B.additionalInformation) " +
        "from " +
        "   Booster B " +
        "   left join Boost Bo on B.id = Bo.boostingAccount.id " +
        "where " +
        "   B.games like %?1% " +
        "   and Bo.finished = true")
List<Booster> findBoostersForOverview(String game);
    List<Booster> findByGamesLikeAndBoostsFinishedIsTrue(String game);