java - with - Usando @EmbeddedId con JpaRepository
jpa repository multiple id (2)
Tengo una clase Entitly simple con @EmbeddedId
(campos Integer
y String
en una clase separada). Y utilizo los Datos de primavera ( org.springframework.data.jpa.repository.JpaRepository
) para acceder a la base de datos (MySql), con la identificación normal, las consultas funcionan bien, tanto la generada por Spring como la que escribí yo. Con el EmbeddedId
pude crear la consulta correcta. Lo que quiero hacer es seleccionar todos los identificadores (uno de los campos de embeddedId para los cuales ocurre alguna condición) Aquí tiene algunos ejemplos de código, tal vez alguien tenga una idea de cómo resolverlo.
La clase de entidad:
@Entity
@Table(name="table_name")
public class EntityClass {
@EmbeddedId
private EmbeddedIdClass id;
private String someField;
//rest of implemetation
}
la clase 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
}
y el repositorio:
@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
}
No encontré ninguna documentación sobre cómo crear los métodos para admitir @EmbeddedId, estaba probando muchos nombres de métodos diferentes, pero siempre obtengo excepciones del analizador de métodos.
(por Yosi Lev) Esto se puede hacer de la siguiente manera: Supongamos que su entidad principal es:
@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;
}
Y tu clase de PK es:
@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;
}
El nombre del método del repositorio JPA debe incluir el nombre del campo id en la clase principal seguido de la propiedad que desea consultar uppon dentro de la clase 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
}
Parece que su consulta está usando nombres de columna. Debe contener los nombres de las propiedades, incluida la navegación en objetos incrustados. También hay una pregunta relacionada aquí en SO: ¿Cómo escribir JPQL SELECT con identificación incrustada?
select distinct id.id from EntityClass where userId = :userId and (...)
El primer id
refiere al atributo id
de EntityClass
(de tipo EmbeddedIdClass
), y el segundo se refiere a la propiedad id
de EmbeddedIdClass
.
Además, asegúrese de que haya una propiedad EntityClass
en EntityClass
.