Pergunta

Eu tenho uma classe Entitly simples com o @EmbeddedId (Integer e String campos em classe separada).E eu uso o Spring Data (org.springframework.data.jpa.repository.JpaRepository) para acessar o banco de dados (MySql), com o Id normal as consultas estão funcionando bem, tanto as geradas pelo Spring quanto as escritas por mim.Com o EmbeddedId Não consegui criar a consulta correta.O que eu quero fazer é selecionar todos os id (um dos campos do incorporadoId para o qual ocorre alguma condição). Aqui você tem alguns exemplos de código, talvez alguém tenha uma idéia de como resolver isso.
A classe de entidade:

@Entity
@Table(name="table_name")
public class EntityClass {

    @EmbeddedId
    private EmbeddedIdClass id;
    private String  someField;
    //rest of implemetation
}

a classe 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
}

e o repositório:

@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
}

Não encontrei nenhuma documentação sobre como criar os métodos para suportar o @EmbeddedId, estava tentando vários nomes de métodos diferentes, mas sempre recebo exceções do analisador de métodos.

Foi útil?

Solução

Parece que sua consulta está usando nomes de colunas.Deve conter os nomes das propriedades, incluindo a navegação em objetos incorporados.Há também uma pergunta relacionada aqui no SO: Como escrever JPQL SELECT com ID incorporado?

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

O primeiro id refere-se ao atributo id de EntityClass (do tipo EmbeddedIdClass), e o segundo refere-se ao id propriedade de EmbeddedIdClass.

Além disso, certifique-se de que haja um userId propriedade em EntityClass.

Outras dicas

(por Yosi Lev) Isso pode ser feito como o seguinte:Suponha que sua entidade principal seja:

@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;
}

E sua classe 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;
 }

O nome do método do repositório JPA Shouls inclui o nome do campo de identificação na classe principal seguida pela propriedade que você deseja consultar o Uppon dentro da classe 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
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top