2016-04-18 9 views
7

मैं एक आंशिक इकाई (NetworkSimple) वसंत डेटा की नई सुविधा का उपयोग करने का एक पेज प्राप्त करने के लिए कोशिश कर रहा हूँ, projectionsस्प्रिंग डेटा जेपीए में पेजिनेशन के साथ प्रक्षेपण इंटरफेस का उपयोग कैसे करें?

मैं प्रलेखन जाँच की है और मैं केवल अनुरोध:

Collection<NetworkSimple> findAllProjectedBy(); 

यह काम करता है, लेकिन अगर मैं पृष्ठांकन योग्य उपयोग कर रहा हूँ:

org.hibernate.jpa.criteria.expression.function.AggregationFunction$COUNT cannot be cast to org.hibernate.jpa.criteria.expression.CompoundSelectionImpl 
:

Page<NetworkSimple> findAllProjectedBy(Pageable pageable); 

यह एक त्रुटि फेंकता

कोई भी पहले से ही इस के साथ काम कर चुका है?

public interface NetworkSimple { 
    Long getId(); 

    String getNetworkName(); 

    Boolean getIsActive(); 
} 

उत्तर

8

नोट का प्रयास करें: यह सुविधा रास्ता मूल पोस्टर द्वारा लेकिन this bug की वजह से ऐसा नहीं किया वर्णित में काम करना चाहिए। हॉपर एसआर 2 रिलीज के लिए बग तय किया गया है, यदि आप पहले के संस्करण पर फंस गए हैं तो नीचे कामकाज काम करेगा।

स्प्रिंग डेटा जेपीए 1.10 (हूपर) में पेश की गई नई क्वेरी प्रक्षेपण सुविधाओं के साथ Pageable का उपयोग करना संभव है। आपको @Query एनोटेशन का उपयोग करने और मैन्युअल रूप से आवश्यक फ़ील्ड के लिए एक क्वेरी लिखनी होगी, उन्हें AS का उपयोग करके एलियाड भी किया जाना चाहिए ताकि स्प्रिंग डेटा को परिणामों को प्रोजेक्ट करने का तरीका पता चल सके। वसंत बूट भंडार के spring-boot-samples भाग में एक अच्छा उदाहरण है।

अपने उदाहरण में यह काफी सरल होगा:

@Entity 
public class Network 
{ 
    @Id 
    @GeneratedValue 
    private Long id; 

    @Column 
    private String name; 

    @Column 
    private boolean active; 

    ... 
} 

स्प्रिंग डाटा के लिए स्वचालित रूप से एक गिनती क्वेरी प्राप्त होगा:

@Query("SELECT n.id AS id, n.name AS networkName, n.active AS isActive FROM Network n") 
Page<NetworkSimple> findAllProjectedBy(Pageable pageable); 

मैं इस धारणा है कि आपकी संस्था इस तरह दिखता है बना दिया है पेजिंग जानकारी। संघों को लाने के लिए क्वेरी में शामिल होने का उपयोग करना और फिर उन्हें प्रक्षेपण में सारांशित करना भी संभव है।

+0

धन्यवाद, मैं इसे जांचूंगा और इसका परीक्षण करूंगा। –

+1

यह पूरी तरह से सही नहीं है। यह वास्तव में मूल पोस्टर अपेक्षाओं के रूप में काम करना चाहिए लेकिन आप एक वैध कामकाज पेश करते हैं। मैंने [टिकट] बदल दिया है (https://jira.spring.io/browse/DATAJPA-909) जो कि मूल पोस्टर द्वारा वास्तविक बग को ठीक करने के लिए आपके वर्कअराउंड के साथ दस्तावेज़ अपडेट करने के लिए दायर किया गया था। अच्छा होगा, अगर आप इसका जवाब देने के लिए अपना उत्तर अपडेट कर सकते हैं। फिक्स हूपर एसआर 2 में होगा। –

+0

टिकट तय किया गया है, स्नैपशॉट उपलब्ध है, जिसे हूपर के एसआर 2 में शामिल किया जाना है। –

0

मुद्दा विधि नाम से आ सकती है:

मेरे NetworkSimple वर्ग निम्नलिखित है। कीवर्ड द्वारा इसका मतलब है कि आप एक विशिष्ट संपत्ति द्वारा फ़िल्टर फ़िल्टर करते हैं: उदाहरण के लिए findNyName। विधि नाम से इसका क्वेरी निर्माण बुलाया:

http://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html/#repositories.query-methods.query-creation

तो साथ Page<NetworkSimple> findAll(Pageable pageable);

+0

यदि मैं "बाय" को हटा देता हूं तो यह एक त्रुटि संदेश देता है, क्योंकि यह क्वेरी नहीं बना सका। 'org.springframework.data.mapping.PropertyReferenceException: कोई प्रॉपर्टी नहीं मिलती है टाइप नेटवर्क के लिए सभी प्रोजेक्ट मिले!' –

+0

मेरा बुरा आपको खोज का उपयोग करना चाहिए सभी विधि का नाम –

+0

लेकिन मैं इसका उपयोग नहीं कर सकता क्योंकि वापसी एक नेटवर्क ऑब्जेक्ट है, और मैं प्रक्षेपण चाहते हैं। –

0

मुझे लगता है कि आपको findAllProjectedBy() विनिर्देश के रूप में बनाने की आवश्यकता है। फिर आप इस तरह की findAll() विधि का उपयोग कर सकते हैं।

उदाहरण: findAll(findAllProjectedBy(),pageable)

नीचे दिए गए लिंक वसंत में विनिर्देश बनाने का तरीका खोजने के लिए मदद कर सकते हैं।

https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/

0

आप उपयोग कर सकते हैं:

@Query("SELECT n FROM Network n") 
Page<? extends NetworkSimple> findAllProjectedBy(Pageable pageable); 
0

यहां तक ​​कि वसंत-डेटा-जेपीए 1.11.4,

की तरह कुछ के साथ
public interface NetworkRepository extends JpaRepository<Network, String> { 
    Page<NetworkSimple> findAll(Pageable pageable); 
} 

संकलन नहीं होता; रिपोर्टिंग

findAll(org.springframework.data.domain.Pageable) in NetworkRepository clashes with findAll(org.springframework.data.domain.Pageable) in org.springframework.data.repository.PagingAndSortingRepository 
return type org.springframework.data.domain.Page<NetworkSimple> is not compatible with org.springframework.data.domain.Page<Network> 

वैकल्पिक हल हमने पाया findAll को findAll नाम बदलने के लिए, उदा था

public interface NetworkRepository extends JpaRepository<Network, String> { 
    Page<NetworkSimple> findAllBy(Pageable pageable); 
} 
संबंधित मुद्दे