ネイティブSQLクエリをJPQLクエリに変換しようとしています。最初に提示JPAエンティティとリポジトリのインターフェースです:ネイティブSQLクエリをJPQLクエリに変換する方法
LearnerActivity
@Entity
@Table(name = "learner_activity")
public class LearnerActivity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToMany
@JoinTable(name = "learner_activity_unit",
joinColumns = @JoinColumn(name="learner_activitys_id", referencedColumnName="ID"),
inverseJoinColumns = @JoinColumn(name="units_id", referencedColumnName="ID"))
private Set<Unit> units = new HashSet<>();
@ManyToMany
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@JoinTable(name = "learner_activity_performance_criteria",
joinColumns = @JoinColumn(name="learner_activitys_id", referencedColumnName="ID"),
inverseJoinColumns = @JoinColumn(name="performance_criterias_id", referencedColumnName="ID"))
private Set<PerformanceCriteria> performanceCriterias = new HashSet<>();
}
LearnerJobOnSiteChecklistSectionItem
@Entity
@Table(name = "learner_job_on_site_checklist_section_item")
public class LearnerJobOnSiteChecklistSectionItem implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
@JoinColumn(name = "learner_activity_id")
private LearnerActivity learnerActivity;
}
私は与えられた
LearnerJobOnSiteChecklistSectionItem
のActivity
と同じPerformanceCriteria
を持つすべてのLearnerPortfolioPerformanceCriteriaAchievement
秒を取得しているよ
@Entity
@Table(name = "learner_portfolio_performance_criteria_achievement")
public class LearnerPortfolioPerformanceCriteriaAchievement implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
@JoinColumn(name = "performance_criteria_id")
private PerformanceCriteria performanceCriteria;
@ManyToMany
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@JoinTable(name = "learner_portfolio_performance_criteria_achievement_learner_job_on_site_checklist_section_item",
joinColumns = @JoinColumn(name="learner_portfolio_performance_criteria_achievements_id", referencedColumnName="ID"),
inverseJoinColumns = @JoinColumn(name="learner_job_on_site_checklist_section_items_id", referencedColumnName="ID"))
private Set<LearnerJobOnSiteChecklistSectionItem> learnerJobOnSiteChecklistSectionItems = new HashSet<>();
}
LearnerPortfolioPerformanceCriteriaAchievement。
LearnerPortfolioPerformanceCriteriaAchievementRepository私は取り替えることができることを理解し
public interface LearnerPortfolioPerformanceCriteriaAchievementRepository extends JpaRepository<LearnerPortfolioPerformanceCriteriaAchievement,Long> {
@Query("select distinct lppca from LearnerJobOnSiteChecklistSectionItem si inner join si.learnerActivity la inner join LearnerPortfolioPerformanceCriteriaAchievement lppca where lppca.performanceCriteria member of la.performanceCriterias and si.id =:sectionItemId")
public List<LearnerPortfolioPerformanceCriteriaAchievement> findForSectionItem(@Param("sectionItemId") Long sectionItemId);
}
ネイティブSQL
SELECT
a.id
FROM
learner_job_on_site_checklist_section_item AS i
JOIN
learner_activity_performance_criteria AS c
ON
c.learned_activitys_id = i.learned_activitys_id
INNER JOIN
learner_portfolio_performance_criteria_achievement AS a
ON
a.performance_criteria_id = c.performance_criterias_id
where i.id = 2
WHERE
句と私のSQL ON
は、私の最高のJPQLの試みは、これまでのところ、このです:
SELECT
DISTINCT lppca
FROM
LearnerJobOnSiteChecklistSectionItem si
INNER JOIN
si.learnerActivity la
INNER JOIN
LearnerPortfolioPerformanceCriteriaAchievement lppca
WHERE
lppca.performanceCriteria MEMBER OF la.performanceCriterias
AND si.id =:sectionItemId
しかし、このJPQLを実行すると、次の例外がスローされます:
Caused by: java.lang.IllegalStateException: No data type for node: org.hibernate.hql.internal.ast.tree.IdentNode
\-[IDENT] IdentNode: 'lppca' {originalText=lppca}
質問を投稿する際には、読者が読みやすいようにコードをできるだけ少なくしてください。今は、コードの長さとクラス名が非常に長いため、扱いにくいです。私は問題の説明や答えに関係のないコードをいくつか削除して、質問を読みやすくしました。 – manish
あなたが過ごした時間を感謝します。将来の質問のコメントありがとうございました。 –