2012-05-18 2 views
20

У меня есть простой класс Entitly с полями @EmbeddedId (Integer и String в отдельном классе). И я использую данные Spring (org.springframework.data.jpa.repository.JpaRepository) для доступа к базе данных (MySql), причем нормальный идентификатор работает нормально, как созданные Spring, так и те, которые я написал сам. С EmbeddedId мне не удалось создать правильный запрос. Я хочу сделать это, чтобы выбрать все id (одно из полей embeddedId, для которого выполняется какое-то условие). Здесь у вас есть примеры кода, возможно, у кого-то появится идея, как его решить.
Объект класса:Использование @EmbeddedId с JpaRepository

@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, я пытался много разных имен методов, но я всегда получаю исключения из парсера метода.

ответ

10

Кажется, ваш запрос использует имена столбцов. Он должен содержать имена свойств, включая навигацию по встроенным объектам. Там также связанный с этим вопрос здесь, на SO: How to write JPQL SELECT with embedded id?

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

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

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

+0

Правильно, мне нужно использовать имена полей и просматривать их, однако я получаю вывод sql с подсчетом (отличным от ...) Где счет? возвращаемый тип - это Page или List (я пытался оба ... – Mat

+0

Ответ в порядке, другая проблема, которую я имел, была доступна для просмотра на странице ... кажется, что запросы с четкими или группами с помощью can not handle Pageable ... pity :( – Mat

21

(по Йоси 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:

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 
} 
+1

для нескольких столбцов-- findByIdCol1AndIdCol2AndIdCol3 (String col1, String col2, String col3); работает – Boo

Смежные вопросы