Frage

Ich habe eine einfache Entitly-Klasse mit dem @EmbeddedId (Integer Und String Felder in separater Klasse).Und ich verwende die Spring Data (org.springframework.data.jpa.repository.JpaRepository), um auf die Datenbank (MySql) zuzugreifen, mit der normalen ID funktionieren die Abfragen einwandfrei, sowohl die von Spring generierten als auch die von mir selbst geschriebenen.Mit dem EmbeddedId Es ist mir nicht gelungen, die richtige Abfrage zu erstellen.Was ich tun möchte, ist, alle IDs auszuwählen (eines der Felder von „embeddedId“, für das eine Bedingung auftritt). Hier haben Sie einige Codebeispiele, vielleicht hat jemand eine Idee, wie man das Problem löst.
Die Entitätsklasse:

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

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

die EmbeddedId-Klasse:

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

und das Repository:

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

Ich habe keine Dokumentation zum Erstellen der Methoden zur Unterstützung von @EmbeddedId gefunden. Ich habe viele verschiedene Methodennamen ausprobiert, erhalte jedoch immer Ausnahmen vom Methodenparser.

War es hilfreich?

Lösung

Offenbar verwendet Ihre Abfrage Spaltennamen.Es sollte die Eigenschaftsnamen enthalten, einschließlich der Navigation in eingebettete Objekte.Hier zu SO gibt es auch eine verwandte Frage: Wie schreibe ich JPQL SELECT mit eingebetteter ID?

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

Der erste id bezieht sich auf Attribut id von EntityClass (vom Typ EmbeddedIdClass), und der zweite bezieht sich auf die id Eigentum von EmbeddedIdClass.

Stellen Sie außerdem sicher, dass es eine gibt userId Eigentum in EntityClass.

Andere Tipps

(von Yosi Lev) Dies kann wie folgt erfolgen:Angenommen, Ihre Hauptentität ist:

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

Und Ihre PK-Klasse ist:

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

Der Name der JPA -Repository -Methode, die SHOLS SHOLEN SHOLEN, enthalten den Namen des ID -Felds in der Hauptklasse, gefolgt von der Eigenschaft, die Sie in der PK -Klasse uppon abfragen möchten:

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
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top