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

在没有nativeQuery标志的@Query注释中,如何将string\u agg与PostgreSQL一起使用?

卢涵畅
2023-03-14

我需要从@Query注释中删除nativaQuery标志
表结构将来可能会发生变化,没有nativeQuery的代码将更容易在以后进行维护。

我有一个类,它使用@ManyTo多国注释链接到类儿童。类儿童有一个字段假名,它是字符串类型的值。

查询的结果需要按classChild中的字符串值排序,我必须对其进行排序,然后将其连接成一个字符串值。

如果我不在string\u agg函数中添加额外的排序,则@query注释中没有nativeQuery标志的查询可以工作:
order by string\u agg(c.pseudoname,,')

如果我添加额外的所需排序如下,发生异常

  • order bystring_agg(c.pseudonym , ',' order byc.pseudonym)
  • org.hibernate.hql.internal.ast.查询语法异常:期待关闭,在第1行,列附近找到'order'...
@Entity
@Getter
@Setter
@Table(name = "parent")
public class Parent {

    @Id
    private Long id;

    private String name;

    @ManyToMany
    @JoinTable(
            name = "parent_child_link",
            joinColumns = {@JoinColumn(name = "parent_id")},
            inverseJoinColumns = {@JoinColumn(name = "child_id")}
    )
    @OrderBy("pseudonym ASC")
    private List<Child> childs = new ArrayList<>();

}
@Entity
@Getter
@Setter
@Table(name = "child")
public class Child {

    @Id
    private Long id;

    private String pseudonym;

    @ManyToMany(mappedBy = "childs")
    private Set<Parent> parents = new HashSet<>();

}
public interface ParentRepository extends JpaRepository<Parent, Long> {

        @Query(nativeQuery = true, value =
            "select p.*" +
                    " from parent p" +
                    " left join parent_child_link link on p.id = link.parent_id" +
                    " left join child c on link.child_id = c.id" +
                    " where p.name = :name" +
                    " group by (p.id)" +
                    " order by string_agg(c.pseudonym, ',' order by c.pseudonym)")
    Page<Parent> find(@Param("name") String name, Pageable pageable);

}

共有1个答案

余靖
2023-03-14

请尝试嵌套查询:

select p.*
from (
    select p, string_agg(c.pseudonym, ',' order by c.pseudonym) ord
    from parent p
    left join parent_child_link link on p.id = link.parent_id
    left join child c on link.child_id = c.id
    where p.name = :name
    group by (p.id)
) inn(p, ord)
order by ord

或:

select p.*
from(
    select p, c.pseudonym
    from parent p
    left join parent_child_link link on p.id = link.parent_id
    left join child c on link.child_id = c.id
    where p.name = :name
    order by p, pseudonym
) inn(p, pseudonym)
group by p.id
order by string_agg(pseudonym, ',')
 类似资料:
  • 问题内容: 我有一个使用自动装配的3个不同类的A类 在测试它们时,我只希望将其中两个类(B&C)作为模拟,并让D类在正常运行时可以自动装配,但此代码对我不起作用: 甚至有可能这样做吗? 问题答案: 应该是这样的 如果您不想成为别人,则无需在课堂上做任何事情。您 应具有的正确实例。此外,我认为你需要使用的工作,用正确的设定。因为您没有使用,所以需要使用 MockitoAnnotations.init

  • 我使用AWS加密客户端。下面的代码抛出错误为 错误:@DoNotTouch不适用于现场 然而,如果我给出@DoNotTouch配置,如下所示[使用getter和setter] 这很好用。我猜lombok生成的getter和setter不会被AmazoneCryptionClient识别 我在跟踪这个aws doc:https://aws.amazon.com/blogs/developer/cli

  • 问题内容: 如何使用hibernate注释来验证枚举成员字段?以下内容不起作用: 问题答案: 请注意,您还可以创建一个验证器来检查String是否为枚举的一部分。 这很好,因为您不会丢失“错误值”的信息。您会收到类似的消息 值“ someBadUserType”不是有效的用户类型。有效的UserType值为:PERSON,COMPANY 编辑 对于那些想要非番石榴版本的人,它应该可以使用类似以下的

  • 我可以使用注释将jdbi查询的结果映射到我感兴趣的bean,如下所示: 如果应用程序中使用的实例尚未注册到任何自定义映射器中,则此操作很好。 此映射器在应用程序开始时注册到实例,如下所示: 重写方法,并提供逻辑将任何类型的结果从数据库转换为相关的bean类型。正是这个uber转换器负责整个应用程序中所有DB到POJO的转换。 我的问题是:有没有一种方法可以告诉继续使用这个将结果从数据库转换为所有类

  • 问题内容: 我正在尝试运行SQL查询以获取四个随机项。由于表中product_filter有多个toupleproduct我必须使用DISTINCTin SELECT,所以出现此错误: 对于SELECT DISTINCT,ORDER BY表达式必须出现在选择列表中 但是,如果我RANDOM()输入了SELECT它,将会避免DISTINCT结果。 有人知道如何DISTINCT与RANDOM()功能一

  • 问题内容: IE8发布后,以下代码是否可以添加条件样式表? 我已经阅读了有关此功能是否适用于Beta的矛盾报告。我希望有人可以分享他们的经验。谢谢。 问题答案: 它对我有用-无论是在怪癖模式下还是在标准合规性模式下。但是,它并 没有 切换到IE8兼容模式下工作。