将@EmbeddedId与JpaRepository一起使用

我有一个简单的Entitly类,带有@EmbeddedId (单独的类中的IntegerString字段)。 我使用Spring Data( org.springframework.data.jpa.repository.JpaRepository )访问数据库(MySql),正常的Id查询工作正常,由Spring生成和我自己编写的。 使用EmbeddedId我没有设法创建正确的查询。 我想要做的是选择所有的id(其中某个条件发生的embeddedId的一个字段)在这里你有一些代码示例,也许有人会知道如何解决它。
实体类:

 @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 { @Query("select distinct ad_id from EntityClass where userId = :userId and (/*here the conditions*/)") public Page findUserAdsWithSearchString(@Param("userId") Integer userId, @Param("searchString") String searchString, Pageable page); //rest of implemetation } 

我没有找到任何文档如何创建支持@EmbeddedId的方法,我尝试了许多不同的方法名称,但我总是从方法解析器获得exception..

您的查询似乎正在使用列名。 它应包含属性名称,包括导航到嵌入对象。 这里还有一个相关的问题: 如何用嵌入式id编写JPQL SELECT?

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

第一个id引用EntityClass属性id (类型为EmbeddedIdClass ),第二个id引用EmbeddedIdClassid属性。

另外,确保EntityClassuserId属性。

(作者: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 { // NOTE: put here both classes - also the pk class.. public List findByIdFlowId(String flowId); // Id - is the // @EmbeddedId in JrulesFlow. FlowId is an attribute // within JrulesFlowPK }