将 @EmbeddedId 与 JpaRepository 一起使用
-
11-12-2019 - |
题
我有简单的实体类 @EmbeddedId
(Integer
和 String
单独类中的字段)。我使用 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<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 的方法,我尝试了许多不同的方法名称,但我总是从方法解析器中得到异常。
解决方案
您的查询似乎正在使用列名称。它应该包含属性名称,包括导航到嵌入对象。这里还有一个相关的问题: 如何编写带有嵌入id的JPQL SELECT?
select distinct id.id from EntityClass where userId = :userId and (...)
首先 id
指的是属性 id
的 EntityClass
(类型 EmbeddedIdClass
),第二个指的是 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存储库方法名称shouls包括主类中的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
}
不隶属于 StackOverflow