2012-05-18 5 views
20

के साथ @EmbeddedId का उपयोग करके मेरे पास @EmbeddedId (Integer और String फ़ील्ड अलग वर्ग में फ़ील्ड के साथ सरल एंटीटीली क्लास है)। और मैं डेटाबेस (MySQL) तक पहुंचने के लिए स्प्रिंग डेटा (org.springframework.data.jpa.repository.JpaRepository) का उपयोग करता हूं, सामान्य आईडी के साथ प्रश्न ठीक काम कर रहे हैं, वसंत द्वारा उत्पन्न दोनों और स्वयं द्वारा लिखे गए दोनों। 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

ऐसा लगता है कि आपकी क्वेरी कॉलम नामों का उपयोग कर रही है। इसमें एम्बेडेड ऑब्जेक्ट्स में नेविगेशन समेत संपत्ति के नाम होना चाहिए। वहाँ भी एक संबंधित सवाल इतने पर यहाँ है: How to write JPQL SELECT with embedded id?

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

पहले idEntityClass (प्रकार EmbeddedIdClass की) की id विशेषता को दर्शाता है, और दूसरा एक EmbeddedIdClass की id संपत्ति को दर्शाता है।

इसके अलावा, सुनिश्चित करें कि userId संपत्ति EntityClass में है।

+0

यह सही है, मुझे फील्ड नामों का उपयोग करना होगा और उन्हें ब्राउज़ करना होगा, हालांकि मुझे आउटपुट एसक्यूएल को सेल्ट गिनती के साथ मिलती है (विशिष्ट ...) से गणना कहाँ है ?? रिटर्न प्रकार पृष्ठ है या सूची (मैं दोनों की कोशिश कर रहा था ... – Mat

+0

उत्तर ठीक है, एक और समस्या मेरे पास एक पेजेबल थी ... ऐसा लगता है कि अलग-अलग या समूह के साथ प्रश्न पृष्ठ को संभाल नहीं सकते ... दयालुता :( – Mat

21

(Yosi लेव द्वारा) इस रूप में किया जा सकता है निम्नलिखित: अपने मुख्य इकाई मान लीजिए है:

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

और अपने पी वर्ग है:

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

जेपीए भंडार विधि नाम shouls में में मुख्य फ़ील्ड के बाद आईडी वर्ग का नाम शामिल है, जिसके बाद आप पीके क्लास के भीतर अपरिपक्व क्वेरी करना चाहते हैं:

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 (स्ट्रिंग col1, स्ट्रिंग col2, स्ट्रिंग col3); काम करता है – Boo

संबंधित मुद्दे

 संबंधित मुद्दे