2016-06-01 24 views
0

ネイティブ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; 
} 

私は与えられたLearnerJobOnSiteChecklistSectionItemActivityと同じ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} 
+0

質問を投稿する際には、読者が読みやすいようにコードをできるだけ少なくしてください。今は、コードの長さとクラス名が非常に長いため、扱いにくいです。私は問題の説明や答えに関係のないコードをいくつか削除して、質問を読みやすくしました。 – manish

+0

あなたが過ごした時間を感謝します。将来の質問のコメントありがとうございました。 –

答えて

0

次のクエリが動作します:

SELECT 
    a 
FROM 
    LearnerPortfolioPerformanceCriteriaAchievement a 
    , LearnerActivity        v 
    , LearnerJobOnSiteChecklistSectionItem   i 
WHERE 
    i.id           = :sectionItemId 
AND i.learnerActivity        = v 
AND a.performanceCriteria       MEMBER OF v.performanceCriterias 
AND i            MEMBER OF a.learnerJobOnSiteChecklistSectionItems 

クエリをテストするためにsample applicationを作成しました(読みやすくするために、より短く簡単なクラス名を使用しています)。

関連する問題