簡體   English   中英

使用JPA在JPQL中是否可以替代本機查詢的“ GROUP_CONCAT”?

[英]Is there an alternative for native query's 'GROUP_CONCAT' in JPQL with JPA?

我正在嘗試使用jpql和JPA來獲取配置文件的配置文件菜單。 我的“個人資料”和“ ProfileMenus”實體具有多對一關系。

我嘗試調查這些答案,但找不到任何有效的解決方案。

如何在Spring Boot應用程序中添加非標准化的sql函數?

向JPA和Hibernate注冊SQL函數

https://vladmihalcea.com/hibernate-sql-function-jpql-criteria-api-query/

我也經歷了這個鏈接,似乎和我的一樣, 如何在Spring Boot應用程序中手動注冊非標准的SQL函數?

使用本機查詢時,我可以使用以下查詢獲取數據:

"SELECT
 GROUP_CONCAT(pm.user_menu_id SEPARATOR ',')
 AS profile_menu_ids,
 p.description
 FROM profile p
 LEFT JOIN profile_menu pm ON p.id = pm.profile_id
 WHERE
 p.id =:profileId
 AND
 pm.status = 'Y'
 GROUP BY p.id"

上面的查詢為我提供了以下數據:

|profile_menu_ids|description  |
|----------------|-------------|
|4,5             |admin profile|

使用JPA在jpql中是否有任何方法或替代方法可以得到如上所述的結果?

您可以考慮使用FluentJPA ,它支持任何自定義功能:

public ProfileMenuGroup getMenuIdsByProfile(int profileId) {
    FluentQuery query = FluentJPA.SQL((Profile p,
                                       ProfileMenu pm) -> {
        String menuIds = alias(GROUP_CONCAT(pm.getUserMenuId(), ","),
                                            ProfileMenuGroup::getProfileMenuIds);
        String description = alias(p.getDescription(), ProfileMenuGroup::getDescription);

        SELECT(menuIds, description);
        FROM(p).LEFT_JOIN(pm).ON(p == pm.getProfile());
        WHERE(p.getId() == profileId && pm.getStatus() == "Y");
        GROUP(BY(p.getId()));
    });
    return query.createQuery(em, ProfileMenuGroup.class).getSingleResult();
}

查詢產生以下SQL( profileId是自動綁定的):

SELECT GROUP_CONCAT(t1.user_menu_id SEPARATOR ',') AS profile_menu_ids,
                                    t0.description AS description 
FROM profile t0  LEFT JOIN profile_menu t1  ON (t0.id = t1.profile_id) 
WHERE ((t0.id = ?1) AND (t1.status = 'Y')) 
GROUP BY  t0.id

給定以下類型聲明:

@Entity
@Data // lombok
@Table(name = "profile")
public class Profile {
    @Id
    private int id;

    private String description;
}

@Entity
@Data // lombok
@Table(name = "profile_menu")
public class ProfileMenu {
    @Id
    private int id;

    @ManyToOne
    @JoinColumn(name = "profile_id")
    private Profile profile;

    private int userMenuId;

    private String status;
}

@Tuple
@Data // lombok
public class ProfileMenuGroup {

    private String profileMenuIds;

    private String description;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM