gpt4 book ai didi

带有 CRUD 存储库的 MySql ANY_VALUE() 方法

转载 作者:行者123 更新时间:2023-11-29 02:44:18 27 4
gpt4 key购买 nike

默认启用 SQL 模式 ONLY_FULL_GROUP_BY。因此,我没有禁用 ONLY_FULL_GROUP_BY,而是尝试使用 ANY_VALUE(arg)

查询获取了我预期的结果。

我希望它与 Spring Boot CrudRepository 一起使用。所以我在 @Query 注释上有它,如下所示(只是一个示例)。我想在复杂查询中使用@Query 注解

@Query("select any_value(c.id), c.number, any_value(c.type) from Call c group by c.number")
public List<Call> getCallsByType(Pageable pageable);

但是会抛出异常

Caused by: java.lang.IllegalStateException: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode 
+-[METHOD_CALL] MethodNode: '('
| +-[METHOD_NAME] IdentNode: 'any_value' {originalText=any_value}
| \-[EXPR_LIST] SqlNode: 'exprList'

如何实现?

最佳答案

您已经告诉 Spring 将该查询视为 native 查询。否则它将尝试根据 JPA 规范对其进行验证。

尝试:

@Query(value = "select any_value(c.id), c.number, any_value(c.type) from Call c group by c.number"
, nativeQuery = true)
public List<Object[]> getCallsByType(Pageable pageable);

请记住,在这种情况下您不能使用 NEW 运算符语法,您必须将结果作为对象数组来处理。

或者

如果您想将结果直接映射到 POJO 类,您必须这样做(假设您使用的是 JPA 2.1+):

1) 定义映射:

@SqlResultSetMapping(
name="resultMapping",
classes={
@ConstructorResult(
targetClass=ResultClass.class,
columns={
@ColumnResult(name="id"),
@ColumnResult(name="number")
// further mappings ...
}
)
}
)

2) 定义原生查询

@NamedNativeQuery(name="getCallsByType"
, query="select any_value(c.id), c.number, any_value(c.type) from Call c group by c.numbe")

3) 在 CrudRepository 中定义这个方法,不用 @Query 注解:

public List<ResultClass> getCallsByType();

关于带有 CRUD 存储库的 MySql ANY_VALUE() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45167891/

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