当前位置: 首页 > 知识库问答 >
问题:

在JPQL中有没有使用JPA替代本机查询的'group_concat'?

单于山
2023-03-14
"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"

上面的查询为me提供了数据,

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

在jpql和JPA中是否有任何方法或替代方案来获得上述结果?

共有1个答案

姚海
2023-03-14

您可以考虑使用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;
}
 类似资料:
  • 我希望执行一个(Postgre)SQL本机查询,它既不是“选择”查询,也不是“更新”查询,也不是“删除”查询。它是“刷新物化视图名称”据我所知没有结果。 使用JPA/JPQL执行此类查询的正确方法是什么? 似乎需要结果集或更新/删除计数。

  • 我想知道是否有可能通过spring jpa存储库执行jpql查询,并能够使用分页作为排序功能,就像使用示例和规范一样。我想做一些类似的事情: QueryByQuestpleExector接口,即声明: JpaSpecificationExector接口声明:

  • 假设我们有下表,命名为“文档”: 两个*日期列是时间戳,而另一个都是字符串(甚至是) 目前我在Spring存储库中使用了以下本机查询: 如您所见,这必须用作本机查询,因为JPA不支持子句中的选择查询。现在我必须将此查询转换为JPQL查询,以使其独立于数据库。这在某种程度上是可能的吗?欢迎其他方法,例如使用规范或类似的...

  • 我试图将我的Mysql查询转换为JPQL,但我不知道哪个工具可以在eclipse上使用而无需编译。 我的日志没有告诉我哪里是错误,所以我找不到哪里是错误的语法。 谢谢你的帮助!

  • 问题内容: 我有一个实体类和一个基于该实体的子类: 和 我需要发出仅在基类(A)上使用存储过程的本机查询。如果我尝试如下: 我收到有关“在ResultSet中未找到clazz_列”的错误。我假设JPA提供程序添加了此列,以便区分基类和扩展类。我可以通过显式添加clazz列和子类中的所有字段来解决此问题: 其中“ prop1”和“ prop2”是子类B的属性。但是,这似乎是不必要的修改,并且如果子类

  • 当使用jpa本机查询 事务传播是我们正在使用的正确jpa的唯一特性吗? 在我的意见中,我就像使用普通的旧jdbc pluc jpa事务传播 我正在阅读PRO JPA一书,根据我的理解 当我们使用JPA本机查询获取一组标量值时(与我们使用jdbc的方式很相似),实际上没有托管实体和持久性上下文的概念。当我们通过本机查询检索实体时,情况会发生变化。