40

@EmbeddedIdIntegerString別のクラスのフィールド)を持つ単純なEntitlyクラスがあります。そして、Spring Data(org.springframework.data.jpa.repository.JpaRepository)を使用してデータベース(MySql)にアクセスします。通常のIDでは、Springによって生成されたものと、自分で作成したものの両方で、クエリは正常に機能しています。私はEmbeddedId正しいクエリを作成することができませんでした。私がやりたいのは、すべてのID(何らかの条件が発生するembeddedIdのフィールドの1つ)を選択することです。ここにいくつかのコードサンプルがあり、誰かがそれを解決する方法を知っているかもしれません。
エンティティクラス:

@Entity
@Table(name="table_name")
public class EntityClass {

    @EmbeddedId
    private EmbeddedIdClass id;
    private String  someField;
    //rest of implemetation
}

EmbeddedIdクラス:

@Embeddable
public class EmbeddedIdClass implements Serializable {

public EmbeddedIdClass(Long id, String language) {
    super();
    this.id = id;
    this.language = language;
}

public UserAdTextId() {}        

@Column(name="ad_id", nullable=false)
    private Integer id;

    @Column(name="language_code", nullable=false)
    private String  language;
    //rest of implemetation
}

およびリポジトリ:

@Transactional(readOnly=true)
public interface MyRepository extends JpaRepository<EntityClass, EmbeddedIdClass> {
    @Query("select distinct ad_id from EntityClass where userId = :userId and (/*here the conditions*/)")
    public Page<Integer> findUserAdsWithSearchString(@Param("userId") Integer userId, @Param("searchString") String searchString, Pageable page);
//rest of implemetation
}

@EmbeddedIdをサポートするためのメソッドを作成する方法についてのドキュメントは見つかりませんでした。さまざまなメソッド名を試していましたが、メソッドパーサーから常に例外が発生します。

4

2 に答える 2

45

(Yosi Levによる)これは次のように実行できます。メインエンティティが次のようになっているとします。

@Entity
@Table(name="JRULES_FLOW")
public class JrulesFlow implements Serializable {
   private static final long serialVersionUID = 1L;

   @EmbeddedId
   private JrulesFlowPK id;

   @Column(name="NEXT_SEQ")
   private int nextSeq;

   @Column(name="REF_ID")
   private String refId;

   @Column(name="TASK_TYPE")
   private String taskType;

   @Column(name="VALUE_TO_FIND")
   private String valueToFind;
}

そしてあなたのPKクラスは:

@Embeddable
public class JrulesFlowPK implements Serializable {
   //default serial version id, required for serializable classes.
   private static final long serialVersionUID = 1L;

   @Column(name="FLOW_ID")
   private String flowId;

   @Column(name="TASK_SEQ")
   private long taskSeq;
 }

JPAリポジトリのメソッド名には、メインクラスのidフィールドの名前と、それに続くPKクラス内でクエリするプロパティが含まれます。

public interface JrulesFlowRepository extends JpaRepository<JrulesFlow, 
      JrulesFlowPK> { // NOTE: put here both classes - also the pk class..
   public List<JrulesFlow>  findByIdFlowId(String flowId);  // Id - is the 
                  // @EmbeddedId in JrulesFlow. FlowId is an attribute 
                  // within JrulesFlowPK
}
于 2015-02-05T14:21:33.453 に答える
19

クエリで列名が使用されているようです。埋め込みオブジェクトへのナビゲーションなど、プロパティ名が含まれている必要があります。SOには関連する質問もあります:埋め込みIDを使用してJPQL SELECTを作成する方法は?

select distinct id.id from EntityClass where userId = :userId and (...)

1つ目は(タイプの)のid属性を参照idし、2つ目はのプロパティを参照します。EntityClassEmbeddedIdClassidEmbeddedIdClass

また、にuserIdプロパティがあることを確認してEntityClassください。

于 2012-05-18T09:18:49.193 に答える