Java 使用本机注释查询获得正确的流结果?
我目前正在使用hibernate 5.0.7,由于HQL查询中的限制(主要是缺少TOP或LIMIT功能),我已经到了尝试实现本机SQL查询的地步。 由于我们的存储库是从接口连接成Springbean的,因此我们目前使用注释查询和函数查询的组合来获取数据 我的查询示例如下Java 使用本机注释查询获得正确的流结果?,java,mysql,spring,hibernate,Java,Mysql,Spring,Hibernate,我目前正在使用hibernate 5.0.7,由于HQL查询中的限制(主要是缺少TOP或LIMIT功能),我已经到了尝试实现本机SQL查询的地步。 由于我们的存储库是从接口连接成Springbean的,因此我们目前使用注释查询和函数查询的组合来获取数据 我的查询示例如下 @Query(value = "SELECT * FROM some_table where (id = ?1)", nativeQuery = true) Stream<MyObject> getMyObjectB
@Query(value = "SELECT * FROM some_table where (id = ?1)", nativeQuery = true)
Stream<MyObject> getMyObjectByIds(String userId);
在我的数据库中,我有一些精确的行值
{2, 3, 5, Whatever, NULL}
然而,当我试图访问从本机查询设置为函数类型的流对象时,最终会出现错误
org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.Object[]] to type [com.myorg.models.MyObject] for value '{2, 3, 5, Whatever, null}'; nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.Integer] to type [com.myorg.models.MyObject]
现在,从我查找的内容来看,人们似乎认为有一个SqlResultSetMapping映射在某个地方不存在,如果我查看我的实体,确实没有这样的映射
@Entity
@NamedEntityGraph(
name = "MyObject.withChildren",
attributeNodes = @NamedAttributeNode(value = "objectChildren")
)
@Getter
@Setter
@Table(name = "object_table", schema = "my_table")
public class MyObject implements Serializable {
实际上,我甚至查了一些东西,并试图实现一个映射
@SqlResultSetMapping(
name = "ObjectMapping",
entities = {
@EntityResult(
entityClass = MyObject.class,
fields = {
@FieldResult(name = "id", column = "id"),
@FieldResult(name = "childId", column = "child_id"),
@FieldResult(name = "someNumber", column = "some_numbur"),
@FieldResult(name = "someString", column = "some_string"),
@FieldResult(name = "someNullableType", column = "null_type_column")
}
)
}
)
我坚持使用实体类,但我真的不知道如何/为什么/是否有必要这样做,更糟糕的是,它甚至不起作用。假设这是对我的代码/问题的一个相当模糊的描述,我是否缺少一些简单的东西,或者有人知道我可能做错了什么
我感谢所有愿意提供帮助的人 最后,我通过将
@namednaviRequesty
附加到实体对象本身,成功地实现了这一点
@NamedNativeQuery(
name = "MyEntity.complexSqlQuery",
query = "SELECT TOP 10 * FROM my_table WHERE (my_table.id = ?1)",
resultClass = MyEntity.class
然后加上
@Query(nativeQuery = true)
List<MyEntity> complexSqlQuery(String whatever);
@Query(nativeQuery=true)
列出complexSqlQuery(字符串);
到我的界面样式库。我不知道这是否理想,因为似乎将大量的查询转储到实体本身并不是最佳做法,我真的希望在我的存储库中已经存在的查询上添加一些带注释的标记(在我的例子中,resultClass似乎正是@Query
注释所需要的),但似乎不存在这样的选项
尽管如此,我还是解决了这个问题,只是不一定以我喜欢的方式。
如果有人对我可能遗漏的内容有所了解,我会非常乐意听到,否则这就是我在此之前提出的解决方案。可能是列命名问题。请检查结果查询列名是否正确命名。例如,如果您仅使用
count(*)
添加count(*)作为某个编号
@Query(nativeQuery = true)
List<MyEntity> complexSqlQuery(String whatever);