web-dev-qa-db-ja.com

ネイティブクエリでSpring Dataからカスタムオブジェクトを返す

私の質問は 別の投稿 に基づいています。ネイティブクエリで同じことを実現するにはどうすればよいですか?ネイティブクエリはJPQLを許可しないため、新しいインスタンスも許可しません。

私のPOJO。

class Coordinates {

    private final BigDecimal latitude
    private final BigDecimal longitude

    ...
}

私のデータベーステーブルには都市の境界の座標が含まれているため、city_name、緯度、経度の3つの列があります。各都市には、Googleマップでシャドウエリアを構築するために使用される多くの(実際には、LOTS)境界座標が含まれています。

そのテーブルで、座標のリストを返す単純なネイティブクエリを作成する予定です。

8

別の投稿 で答えを見つけました。基本的に、私はSqlResultSetMappingConstructorResultとともに使用しました(他の方法はありません)。言及した投稿の受け入れられた回答に関するコメントに特別な注意を払っています:_@NamedNativeQuery_使用されたinterface[〜#〜]および[〜#〜]のエンティティへの注釈は、エンティティ名に_._それ以外の場合は動作しません。

例:

_@Entity
@Table(name = "grupo_setorial")
@SqlResultSetMapping(
        name = "mapeamentoDeQuadrantes",
        classes = {
                @ConstructorResult(
                        targetClass = Coordenada.class,
                        columns = {
                                @ColumnResult(name = "latitude"),
                                @ColumnResult(name = "longitude")
                        }
                )
        }
)
@NamedNativeQuery(
        name = "GrupoCensitario.obterPerimetroDosSetores",
        query = "SELECT latitude as latitude, longitude as longitude FROM coordenadas where id_setor IN (:setores)",
        resultSetMapping = "mapeamentoDeQuadrantes"
)
public class GrupoCensitario {
_
12

これは https://jira.spring.io/browse/DATAJPA-98 および Here は問題を示すプロジェクトです。

@Query(value = "SELECT name AS name, age AS age FROM Person", nativeQuery = true)
List<PersonSummary> findAllProjectedNativeQuery();

これは、Hibernate 5.2.11に付属するSpring Data JPA 2.0 GA(Kay)リリースで修正されています。

この問題は、Spring Data 1.10.12(Ingalls)および1.11.8(Hopper)でも修正されていますが、動作するにはHibernate 5.2.11で実行する必要があります。

4
ltsallas

JPAの一部である sql result set mapping を使用する必要があります。

2
johncena

spring-dataの最新バージョンを使用しており、Repositoriesも使用している場合、 Itsallas からの答えが正しい解決策につながると個人的に思います。

私は実際に(Spring Data)Projectionsについてはまだしていませんでした。

したがって、Spring Data JPA - Reference Documentationへのリンクを追加したいだけです。 プロジェクションの章 をご覧ください。

通常、Spring Dataクエリメソッドは、リポジトリによって管理される集約ルートの1つまたは複数のインスタンスを返します。ただし、これらのタイプの特定の属性に基づいて投影を作成することが望ましい場合があります。 Spring Dataでは、専用の戻り値型をモデリングして、管理対象集合体の部分ビューをより選択的に取得できます。

0
morecore

私が見つけた答え:

public interface UserEventRepository extends JpaRepository<UserEvent, Long> {

    List<UserEvent> findAllByUserId(Long userId);

    @Query(value = "SELECT user_id FROM user_event ue " +
                   "WHERE ue.user_id = :userId", nativeQuery = true)
    List<Long> findUserIdByEventId(@Param("userId") Long userId);
}

そのようにして、Longのリスト-IDのリストを返します。ここで重要なのは、nativeQueryプロパティをtrueに設定していることです。値自体は、実行するクエリです。

それがお役に立てば幸いです。それは明確な解決策のようです。

0
Reneta