2016-05-09 9 views
6

मेरी स्प्रिंग डाटा परियोजना में मैं एक निम्न इकाई है:स्प्रिंग डाटा - या भंडार विधि नाम पर हालत

@Entity 
@NamedEntityGraph(name = "graph.CardPair", attributeNodes = {}) 
@Table(name = "card_pairs") 
public class CardPair extends BaseEntity implements Serializable { 

    private static final long serialVersionUID = 7571004010972840728L; 

    @Id 
    @SequenceGenerator(name = "card_pairs_id_seq", sequenceName = "card_pairs_id_seq", allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "card_pairs_id_seq") 
    private Long id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "card1_id") 
    private Card card1; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "card2_id") 
    private Card card2; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "selected_card_id") 
    private Card selectedCard; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "board_id") 
    private Board board; 

.... 

} 

मैं एक स्प्रिंग डाटा रिपोजिटरी विधि पर cardPairId आधारित एक CardPair के लिए दिखेगा लागू करने की आवश्यकता, board और card। मेरे लिए अधिक जटिल मामला Card है क्योंकि मुझे ऐसी स्थिति बनाने की आवश्यकता है जहां card1 = card or card2 = card

क्या यह स्थिति स्प्रिंग डेटा रिपॉजिटरी विधि नाम के माध्यम से प्रदान करना संभव है?

उदाहरण

cardPairRepository.findByIdAndBoardAnd[card1 = card or card2 = card]AndSelectedCardIsNull(cardPairId, board, card); 

के लिए यह एक विधि नाम पर इस हालत card1 = card or card2 = card अनुवाद करने के लिए संभव है?

+0

तुम सिर्फ की तलाश में हैं यहां एक विधि का नाम है? –

+0

हां, मैं इस विधि का नाम किसी निर्दिष्ट स्थिति के साथ नहीं बना सकता – alexanoid

+2

जटिल उपयोग मामलों के लिए केवल खोजकर्ता विधियों का उपयोग करें, जटिल मामलों के लिए एक प्रश्न लिखें और '@ क्वेरी' एनोटेशन का उपयोग करें। –

उत्तर

2

जैसा कुछ होना चाहिए, केवल इसे विधि विधि का उपयोग करके हासिल करना असंभव है क्योंकि आपको ब्रैकेट में होने वाली अंतिम स्थिति की आवश्यकता है: id = ? AND board = ? AND (card1 = ? OR card2 = ?)। विधि नाम से इसका अनुमान लगाने का कोई तरीका नहीं है क्योंकि इसका उद्देश्य केवल बुनियादी मामलों को कवर करना है।

वहाँ अपने मामले में तीन तरीके हैं:

0

आप विधि areCardsEqual(Card first, Card second)

ऐसा लगता है कि आप अपने विधि नीचे विभाजित करना चाहिए के रूप में आप एक विधि में आपरेशन का एक बहुत कर रहे हैं कह सकते हैं। सर्वोत्तम प्रथाओं से संकेत मिलता है कि प्रत्येक विधि को एक ऑपरेशन के लिए जिम्मेदार होना चाहिए।

... वरना तुम सिर्फ आपकी क्वेरी के बाद से HQL का उपयोग कर एक @Query उपयोग कर सकते हैं जटिल है

+0

नहीं, मुझे स्प्रिंग डेटा रिपोजिटरी बनाने की ज़रूरत है विधि, इस तरह कुछ - findByIdAndBoardAndCard1OrCard2AndSelectedCardIsNull – alexanoid

+0

तब आपका इनपुट क्या होगा? –

+0

'कार्डपेयर आईडी, 'बोर्ड' और' कार्ड' – alexanoid

0

आप यहाँ सभी कार्यों पा सकते हैं: http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html खंड 2.2.2

findByIdAndBoardAndCard1OrCard2(cardPairId, board, card, card); 

मैं testen नहीं किया है इसका ऑर्डर, लेकिन यह

+0

यह काम नहीं करता है - findByIdAndBoardAndCard1OrCard2 (कार्डपेयर आईडी, वर्तमान बोर्ड, कार्ड) रन-टाइम अपवाद के साथ। – alexanoid

+0

कार्ड को पैरामीटर में दो बार होना चाहिए। –

+0

मेरी आखिरी टिप्पणी के अलावा, यह ब्रैकेट के कारण बिल्कुल भी काम नहीं कर सकता है जिसे OR कथन में जोड़ा जाना चाहिए। लेकिन हो सकता है कि वसंत जानता है कि आदेश के कारण इसे कैसे संभाला जाए। एलेक द्वारा सुझाए गए '@ प्रश्न' शायद संभवतः सुरक्षित हैं। –

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