জেপিকিউএল প্রশ্নের জন্য সমাধান
এটি JPA নির্দিষ্টকরণের মধ্যে JPQL প্রশ্নের জন্য সমর্থিত ।
পদক্ষেপ 1 : একটি সাধারণ শিমের বর্গ ঘোষণা করুন
package com.path.to;
public class SurveyAnswerStatistics {
private String answer;
private Long cnt;
public SurveyAnswerStatistics(String answer, Long cnt) {
this.answer = answer;
this.count = cnt;
}
}
পদক্ষেপ 2 : সঞ্চিত প্রতিস্থাপন পদ্ধতি থেকে দৃষ্টান্তগুলি ফেরত দিন
public interface SurveyRepository extends CrudRepository<Survey, Long> {
@Query("SELECT " +
" new com.path.to.SurveyAnswerStatistics(v.answer, COUNT(v)) " +
"FROM " +
" Survey v " +
"GROUP BY " +
" v.answer")
List<SurveyAnswerStatistics> findSurveyCount();
}
গুরুত্বপূর্ণ নোট
- প্যাকেজের নাম সহ শিম শ্রেণীর সম্পূর্ণরূপে যোগ্য পথ সরবরাহ নিশ্চিত করুন। উদাহরণস্বরূপ, যদি মটরশুটি শ্রেণি কল করা হয়
MyBean
এবং এটি প্যাকেজে থাকে তবে শিমের com.path.to
সম্পূর্ণরূপে যোগ্য পাথ হবে com.path.to.MyBean
। কেবল সরবরাহ করা কার্যকর MyBean
হবে না (যদি না বিন বিন্যাস ডিফল্ট প্যাকেজে না থাকে)।
new
কীওয়ার্ডটি ব্যবহার করে শিমের বর্গ নির্মাণকারীকে কল করতে ভুলবেন না । SELECT new com.path.to.MyBean(...)
কাজ করবে, যেখানে SELECT com.path.to.MyBean(...)
হবে না।
- শিম নির্মাতা হিসাবে প্রত্যাশার সাথে ঠিক একই ক্রমে বৈশিষ্ট্যগুলি পাস করার বিষয়টি নিশ্চিত করুন। ভিন্ন ক্রমে গুণাবলী পাস করার চেষ্টা করা ব্যতিক্রম ঘটায়।
- নিশ্চিত করুন যে ক্যোয়ারীটি একটি বৈধ জেপিএ ক্যোয়ারী, এটি, এটি কোনও স্থানীয় কোয়েরি নয়।
@Query("SELECT ...")
, বা @Query(value = "SELECT ...")
, বা @Query(value = "SELECT ...", nativeQuery = false)
কাজ করবে, যেখানে @Query(value = "SELECT ...", nativeQuery = true)
কাজ করবে না। এর কারণ হ'ল দেশীয় কোয়েরিগুলি জেপিএ সরবরাহকারীকে সংশোধন ছাড়াই পাস করা হয় এবং অন্তর্নিহিত আরডিবিএমএসের বিরুদ্ধে কার্যকর হয়। যেহেতু new
এবং com.path.to.MyBean
বৈধ এসকিউএল কীওয়ার্ড নয়, আরডিবিএমএস তার পরে একটি ব্যতিক্রম ছুঁড়ে দেয়।
দেশীয় প্রশ্নের জন্য সমাধান
উপরে উল্লিখিত হিসাবে, new ...
বাক্য গঠনটি একটি জেপিএ-সমর্থিত প্রক্রিয়া এবং সমস্ত জেপিএ সরবরাহকারীদের সাথে কাজ করে। তবে, যদি কোয়েরিটি নিজেই জেপিএ কোয়েরি না হয়, এটি একটি নেটিভ কোয়েরি, new ...
বাক্যটি সরাসরি অন্তর্নিহিত আরডিবিএমএসে প্রেরণ করা হওয়ায় সিনট্যাক্সটি কাজ করবে না, যা মূলশব্দটি বোঝে না new
কারণ এটি এর অংশ নয় not এসকিউএল স্ট্যান্ডার্ড।
এ জাতীয় পরিস্থিতিতে, শিমের ক্লাসগুলি স্প্রিং ডেটা প্রজেকশন ইন্টারফেসের সাথে প্রতিস্থাপন করা দরকার ।
পদক্ষেপ 1 : একটি অভিক্ষেপ ইন্টারফেস ঘোষণা করুন
package com.path.to;
public interface SurveyAnswerStatistics {
String getAnswer();
int getCnt();
}
পদক্ষেপ 2 : ক্যোয়ারী থেকে অনুমানিত বৈশিষ্ট্যগুলি ফিরিয়ে দিন
public interface SurveyRepository extends CrudRepository<Survey, Long> {
@Query(nativeQuery = true, value =
"SELECT " +
" v.answer AS answer, COUNT(v) AS cnt " +
"FROM " +
" Survey v " +
"GROUP BY " +
" v.answer")
List<SurveyAnswerStatistics> findSurveyCount();
}
AS
দ্ব্যর্থহীন ম্যাপিংয়ের জন্য প্রোজেক্ট বৈশিষ্ট্যগুলিতে ফলাফল ক্ষেত্রগুলিতে মানচিত্রের জন্য এসকিউএল কীওয়ার্ডটি ব্যবহার করুন ।
Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate class [SurveyAnswerReport] [select new SurveyAnswerReport(v.answer,count(v.id)) from com.furniturepool.domain.Survey v group by v.answer] at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1750) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677) at org.hibernate.jpa.spi.AbstractEnti..........