Вопрос по java, spring – Использование @EmbeddedId с JpaRepository

30

У меня есть простой класс Entitly с@EmbeddedId (Integer а такжеString поля в отдельном классе). И я использую Spring Data (org.springframework.data.jpa.repository.JpaRepository) для доступа к базе данных (MySql), с нормальным Id, запросы работают нормально, как сгенерированные Spring, так и написанные мной. С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, я пробовал много разных имен методов, но я всегда получаю исключения из анализатора методов ..

Ваш Ответ

2   ответа
34

Это можно сделать следующим образом: Предположим, что ваша основная сущность это:

@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 должно включать имя поля id в основной класс, за которым следует свойство, которое вы хотите запросить uppon в классе 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
}
Error: User Rate Limit Exceeded
15

ваш запрос использует имена столбцов. Он должен содержать имена свойств, включая навигацию по встроенным объектам. Здесь также есть связанный вопрос о SO:Как написать JPQL SELECT со встроенным идентификатором?

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

Первыйid относится к атрибутуid изEntityClass (типаEmbeddedIdClass), а второй относится кid собственностьюEmbeddedIdClass.

Кроме того, убедитесь, чтоuserId недвижимость вEntityClass.

Error: User Rate Limit Exceeded Mat
Error: User Rate Limit Exceeded Mat

Похожие вопросы