2014-06-11 15 views
9

पर उचित निर्माता पता नहीं लग सका मैं अपने POJO के मूल निवासी एसक्यूएल परिणाम मैप करने के लिए कोशिश कर रहा हूँ। विन्यास यहाँ है। मैं वसंत का उपयोग कर रहा हूँ। मैं कैसे यहहो रही त्रुटि वर्ग

Properties coursePropertiesFile = SpringUtil.loadPropertiesFileFromClassPath("course.properties"); 
    String queryString = coursePropertiesFile.getProperty("course.completion.sql"); 

    long distributorId = 1; 
    String fromDate = "2009-09-22 00:00:00"; 
    String toDate = "2014-04-11 23:59:59"; 

    Query query = em.createNativeQuery(queryString, "courseCompletionMapping"); 

    //Query query = em.createNamedQuery("findAllEmployeeDetails"); 
    query.setParameter("distributorId", distributorId); 
    query.setParameter("fromDate", fromDate); 
    query.setParameter("toDate", toDate); 

    @SuppressWarnings("unchecked") 
    List<CourseCompletion> courseCompletionList = query.getResultList(); 

बोल रहा हूँ लेकिन जब यह

List<CourseCompletion> courseCompletionList = query.getResultList(); 

लाइन की बात आती है मुझे लगता है कि

कोई त्रुटि मिलती है

<bean id="ls360Emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" > 
    <property name="dataSource" ref="ls360DataSource" /> 
    <property name="jpaVendorAdapter" ref="vendorAdaptor" />   
    <property name="packagesToScan" value="abc.xyz"/> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> 
      <prop key="hibernate.max_fetch_depth">3</prop> 
      <prop key="hibernate.jdbc.fetch_size">50</prop> 
      <prop key="hibernate.jdbc.batch_size">10</prop> 
      <prop key="hibernate.show_sql">true</prop>    
     </props>   
    </property> 
</bean> 

यहाँ

@SqlResultSetMapping(
    name="courseCompletionMapping", 
    classes = { 
     @ConstructorResult(targetClass = CourseCompletion.class, 
      columns={ 
       @ColumnResult(name = "StoreId", type = String.class), 
       @ColumnResult(name = "ProductId", type = String.class), 
       @ColumnResult(name = "UserName", type = String.class), 
       @ColumnResult(name = "Score", type = Integer.class), 
       @ColumnResult(name = "CompletionDate", type = Date.class) 
      } 
     ) 
    } 
) 
@Entity 
public class CourseCompletion { 
    private String storeId; 

    @Id 
    private String productId; 
    private String userName; 
    private int score; 
    private Date completionDate; 

    public CourseCompletion() { 
    } 

    public CourseCompletion(String storeId, String productId, String userName, int score, Date completionDate) { 
     this.storeId = storeId; 
     this.productId = productId; 
     this.userName = userName; 
     this.score = score; 
     this.completionDate = completionDate; 
    } 

    // getters and setters 

यहाँ मेरी कक्षा है

Could not locate appropriate constructor on class : mypackage.CourseCompletion 

क्वेरी कि मैं

select d.DISTRIBUTORCODE AS StoreId, u.USERGUID AS ProductId, u.UserName, 
    lcs.HIGHESTPOSTTESTSCORE AS Score, lcs.CompletionDate 
from VU360User u 
inner join learner l on u.ID = l.VU360USER_ID 
inner join LEARNERENROLLMENT le on le.LEARNER_ID = l.ID 
inner join LEARNERCOURSESTATISTICS lcs on lcs.LEARNERENROLLMENT_ID = le.ID 
inner join customer c on c.ID = l.CUSTOMER_ID 
inner join DISTRIBUTOR d on d.ID = c.DISTRIBUTOR_ID 
where d.ID = :distributorId 
and lcs.COMPLETIONDATE is not null 
and (lcs.COMPLETIONDATE between :fromDate and :toDate) 
and lcs.COMPLETED = 1 

कोशिश कर रहा हूँ मैं क्यों इस त्रुटि हो रही है है?

धन्यवाद

उत्तर

27

यह अपवाद इसलिए होता है क्योंकि जेपीए परिवर्तन नहीं करता है कॉलम प्रकार के देशी प्रश्नों के लिए डेटाबेस से लौट आए। इस वजह से, आपके पास टाइप मिस्चैच है। मुझे यकीन है कि जिसके बारे में स्तंभ आपके मामले में इस समस्या को (इस डीबीएमएस आप उपयोग पर निर्भर करता है) का कारण बनता है नहीं कर रहा हूँ, लेकिन मुझे लगता है तुम परिणाम के लिए Integer के बजाय सेट में BigInteger है स्कोर कॉलम खोजें। 100% सुनिश्चित करने के लिए, ConstructorResultColumnProcessor.resolveConstructor(Class targetClass, List<Type> types) पर ब्रेकपॉइंट जोड़ें और जांच करें। मेल खाने के बाद, अपने मैपिंग क्लास में फील्ड प्रकार बदलें।

एक अन्य समाधान बिल्कुल @SqlResultSetMapping उपयोग करने के लिए नहीं होगा। अपने CourseCompletion वर्ग एक प्रबंधित इकाई है, उसे सीधे यह करने के लिए मूल क्वेरी मैप करने के लिए सक्षम होना चाहिए। अधिक जानकारी के लिए this question देखें।

+3

धन्यवाद :)। मैंने समस्या हल कर ली है। मैंने प्रोग्राम डीबग किया और फिर पाया कि स्कोर कॉलम डबल टाइप का है। तो फिर मैं बस '@ColumnResult (नाम =" स्कोर ", type = Double.class)' और परिवर्तन स्कोर 'Double' के प्रकार से किया था। – Basit

+1

बहुत धन्यवाद :)। यह डीबग करने में मदद की। मेरे मामले में समस्या java.sql.Datetime के कारण थी। हाइबरनेट माइक्रोसॉफ्ट एसक्यूएल कॉलम से java.util.Datetime तक डेटाटाइम को परिवर्तित कर रहा है। कॉलम प्रकार को java.util में बदलने के बाद। डेटाटाइम, यह हल हो गया। –

+0

बहुत बहुत धन्यवाद :)। यह डीबग करने में मदद की। मेरे मामले में समस्या java.sql.Timestamp के कारण थी। हाइबरनेट माइक्रोसॉफ्ट एसक्यूएल कॉलम से java.util.Date तक डेटाटाइम को परिवर्तित कर रहा है। कॉलम प्रकार को java.util.Date में बदलने के बाद, यह हल हो गया। – whoami

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