without with primary not multiple idclass foreign does define java spring jpa jpql spring-data

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 .