2017-08-08 8 views
1

私は現在、Hibernate 5.0.7を使用しています.HQLクエリの制限(主にTOPまたはLIMIT能力の欠如)のために、ネイティブSQLクエリを実装しようとしています。 私たちのリポジトリがインターフェイスからの春の豆として結ばれているため、データを取得するために注釈付きクエリと機能クエリを組み合わせて使用​​しています。ネイティブアノテーション付きクエリで適切なストリーム結果を取得していますか?

しかし

@Query(value = "SELECT * FROM some_table where (id = ?1)", nativeQuery = true) 
Stream<MyObject> getMyObjectByIds(String userId); 

次のように私のクエリのサンプルがあります。私の実際のクエリはより複雑で、GroupBy(機能クエリにはないようなもの)とTop(HQLクエリにはないようなものがあります)を使用します。

私たちのデータベースのすべてのテーブルとアイテムマッピングされたエンティティであり、現在データベースにあるすべてのデータは、これらの休止状態のエンティティによって開始されます。今、私は私のクエリを実行すると、私は実際にそれは私が

バック

{2, 3, 5, Whatever, null} 
を取得し終わると、私のデータベースに私は正確にいくつかの行の値

を持っている私のデータである必要があり、非常にのように見えるその背中結果を得ますしかし
{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") 
      } 
     ) 
    } 
) 

と私のエンティティクラスに固執しましたが、実際にはどのように/なぜ/これが必要なのかわからなくても、それはうまく動作しませんでした。これは私のコード/問題のかなり難読化された記述であることが認められていますが、私は行方不明のものがありますか、誰かが私が間違っているかもしれないことを知っていますか?

人々が提供してくれるすべてのヘルプに感謝しています。

+0

列の名前の問題があります。結果クエリの列名が正確に指定されていることを確認します。例えば。 'count(*)'だけを使用して 'count(*)some_number'を追加すると – StanislavL

答えて

0

最後に、私は私のエンティティオブジェクト自体

@NamedNativeQuery(
name = "MyEntity.complexSqlQuery", 
query = "SELECT TOP 10 * FROM my_table WHERE (my_table.id = ?1)", 
resultClass = MyEntity.class 

@NamedNativeQueryを取り付け、その後、私のインターフェイススタイルのリポジトリに

@Query(nativeQuery = true) 
List<MyEntity> complexSqlQuery(String whatever); 

を追加することで、この作業を取得するために管理してきました。私はこれが理想的かどうかわかりませんが、エンティティ自体にクエリーの読み込みをダンプすることはベストプラクティスではなく、実際にはすでに存在するクエリーを投げることができる注釈付きタグがほしいと思っていましたリポジトリ(resultClassはまさに@Query注釈が私の場合これをサポートするのにを必要としているようですが)そのようなオプションは存在しないようです。

どれほど少なくても、私はこれを解決しました。私が好きなように必ずしもそうではありません。 誰かが私が逃したかもしれないことについてのいくつかの洞察力を持っているなら、私はそれを聞くために非常に開いているでしょう、そうでなければこれまで私が思い付いた解決策です。

関連する問題