@EmbeddedId
(別のクラスのInteger
フィールドとString
フィールド)を持つ単純な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をサポートするためのメソッドの作成方法に関するドキュメントは見つかりませんでした。多くの異なるメソッド名を試していましたが、メソッドパーサーから常に例外が発生します。
クエリは列名を使用しているようです。埋め込みオブジェクトへのナビゲーションを含む、プロパティ名を含める必要があります。 SOにも関連する質問があります。 IDを埋め込んだJPQL SELECTの書き方
select distinct id.id from EntityClass where userId = :userId and (...)
最初のid
はid
の属性EntityClass
(EmbeddedIdClass
型)を参照し、2番目はid
プロパティを参照しますEmbeddedIdClass
。
また、userId
にEntityClass
プロパティがあることを確認してください。
(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クラス内でupponにクエリするプロパティが含まれます。
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
}