将@EmbeddedId与JpaRepository一起使用

Mat*_*Mat 35 java spring jpa jpql spring-data

我有简单的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
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

和存储库:

@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
}
Run Code Online (Sandbox Code Playgroud)

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

yle*_*lev 40

(作者: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;
}
Run Code Online (Sandbox Code Playgroud)

你的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;
 }
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

  • 对于多列 - findByIdCol1AndIdCol2AndIdCol3(String col1,String col2,String col3); 作品 (3认同)

Xav*_*ica 16

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

select distinct id.id from EntityClass where userId = :userId and (...)
Run Code Online (Sandbox Code Playgroud)

第一个id引用(类型)属性id,第二个引用属性.EntityClassEmbeddedIdClassidEmbeddedIdClass

另外,请确保有userId房产EntityClass.