【问题标题】:Manage @NamedNativeQuery and schema管理 @NamedNativeQuery 和架构
【发布时间】:2012-12-07 08:44:28
【问题描述】:

我有很多 EntityManager,每个架构一个(我使用 entity-mappings 文件将 EM 与架构映射)。它有效。

当我使用@NamedQuery 时,它就像一个魅力,但是当我使用@NamedNativeQuery 时,架构没有被使用。我必须符合条件SELECT foo FROM schema.table

这是正确的行为吗?

我认为不可能通过参数 @NamedNativeQuery 来动态传递架构(我相信只有列可以是动态的,而不是表或架构或其他任何东西)所以我该如何将 @NamedNativeQuery 与动态架构一起使用?

【问题讨论】:

    标签: jpa schema nativequery


    【解决方案1】:

    在你的表名前加上“{h-schema}”,例如SELECT foo FROM {h-schema}table

    (由getting hibernate default schema name programmatically from session factory?提供)

    【讨论】:

    • 这个不错。并且架构名称已经包含点“。” XDD
    【解决方案2】:

    文档摘录:

    • NamedNativeQuery : 指定命名的本机 SQL 查询。查询名称的范围是持久性单元。
    • NamedQuery : 以 Java Persistence 查询语言指定静态的命名查询。查询名称的范围为持久性单元。

    没有直接指定NamedNativeQuery 是静态的,但两者的作用域相同,之后无法更改,这是所需的行为。

    命名查询意味着由多个模块访问 - 应用程序范围,由唯一名称标识,因此它们是静态和常量。您可以尝试动态构建查询字符串并可以从中创建本机查询,而不是命名本机查询。

    【讨论】:

    • 我知道我能做到。所以对你来说,不可能使用带有动态模式的命名本机查询吗?泰
    • @OlivierJ。是的,不能将表/模式等作为参数传递给命名查询
    • 好的,我将使用字符串动态生成我的查询。谢谢
    • 如果值取自非托管来源(如用户输入),则动态生成任何查询字符串可能会带来安全风险,因此应谨慎执行。此外,动态查询无法利用连接池管理性能特性来实现数据库内的查询和执行计划重用。而是根据任何条件使用逻辑来查找 namedQueryX 与 namedQueryY,每个 NamedQuery 都绑定到它们各自的持久性单元。
    • @DarrellTeague 是的,如果直接在查询中提供输入而不是设置参数/使用命名查询,则会存在安全风险。最好有单独的持久性单元。
    猜你喜欢
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    相关资源
    最近更新 更多