سؤال

لدي فئة Ently بسيطة مع @EmbeddedId (Integer و String الحقول في فئة منفصلة).وأنا أستخدم بيانات الربيع (org.springframework.data.jpa.repository.JpaRepository) للوصول إلى قاعدة البيانات (MySql)، باستخدام المعرف العادي، تعمل الاستعلامات بشكل جيد، سواء التي تم إنشاؤها بواسطة Spring أو تلك التي كتبتها بنفسي.مع ال EmbeddedId لم أتمكن من إنشاء الاستعلام الصحيح.ما أريد القيام به هو تحديد كل المعرفات (أحد حقول المعرف المضمن الذي تحدث له بعض الحالات) هنا لديك بعض نماذج التعليمات البرمجية، ربما يكون لدى شخص ما فكرة عن كيفية حلها.
فئة الكيان:

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

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

فئة المعرف المضمن:

@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، كنت أحاول العديد من أسماء الطرق المختلفة، لكنني دائمًا أحصل على استثناءات من محلل الطريقة..

هل كانت مفيدة؟

المحلول

يبدو أن الاستعلام الخاص بك يستخدم أسماء الأعمدة.ويجب أن يحتوي على أسماء الخصائص، بما في ذلك التنقل إلى الكائنات المضمنة.هناك أيضًا سؤال ذو صلة هنا على SO: كيف تكتب JPQL SELECT بالمعرف المضمن؟

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

الأول id يشير إلى السمة id ل EntityClass (من النوع EmbeddedIdClass)، والثاني يشير إلى id ممتلكات EmbeddedIdClass.

تأكد أيضًا من وجود userId الممتلكات في EntityClass.

نصائح أخرى

(بواسطة Yosi 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 اسم حقل المعرف في الفئة الرئيسية تليها الخاصية التي تريد الاستعلام عن 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
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top