2012-05-18 2 views
20

J'ai une classe Entitly simple avec les champs @EmbeddedId (Integer et String dans une classe séparée). Et j'utilise les données de printemps (org.springframework.data.jpa.repository.JpaRepository) pour accéder à la base de données (MySql), avec l'Id normal les requêtes fonctionnent bien, à la fois les générées par Spring et celles que j'ai écrites. Avec le EmbeddedId je n'ai pas réussi à créer la requête correcte. Ce que je veux faire est de sélectionner tout l'id (un des champs de embeddedId pour lequel une condition se produit) Voici quelques exemples de code, peut-être que quelqu'un aura une idée pour le résoudre.
La classe d'entité:Utilisation de @EmbeddedId avec JpaRepository

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

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

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

et le dépôt:

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

Je ne trouve pas de documentation comment créer des méthodes pour soutenir la @EmbeddedId, j'essayais de nombreux noms de méthodes différentes, mais j'obtiens toujours des exceptions de l'analyseur de méthode.

Répondre

10

Il semble que votre requête utilise des noms de colonnes. Il doit contenir les noms des propriétés, y compris la navigation dans les objets incorporés. Il y a aussi une question connexe ici sur le SO: How to write JPQL SELECT with embedded id?

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

Le premier id fait référence à attribuer id de EntityClass (de type EmbeddedIdClass), et le second fait référence à la propriété id de EmbeddedIdClass. De plus, assurez-vous qu'il existe une propriété userId dans EntityClass

+0

C'est vrai, je dois utiliser les noms des champs et les parcourir, mais je reçois la sortie sql avec le nombre de seelct (distinct ...) Où est le nombre de? le type de retour est Page ou Liste (J'essayais les deux ... – Mat

+0

La réponse est ok, un autre problème que j'avais était paginable ... il semble que les requêtes avec distinct ou par groupe ne peuvent pas gérer Pageable ... pitié :( – Mat

21

(par Yosi Lev) Cela peut se faire comme suit: Supposons que votre entité principale est:

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

Et votre classe PK est:

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

Le nom de la méthode de dépôt JPA shouls incluent le nom du champ id dans la classe principale suivie par la propriété que vous souhaitez interroger uppon dans la 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 
} 
+1

pour plusieurs colonnes-- findByIdCol1AndIdCol2AndIdCol3 (chaîne col1, chaîne col2, chaîne col3); – Boo

Questions connexes