【问题标题】:Querying to the table with the multiple language columns查询具有多语言列的表
【发布时间】:2023-03-31 08:22:01
【问题描述】:

在表 object_addresses 中,我有 3 列(用于 3 种语言)name_en、name_it、name_sk。将来会添加其他语言的列。

是否有可能以某种方式根据所需语言对此类表进行查询 SELECT name_{en, it, sk} FROM object_addresses,而无需为每种语言创建 3 个查询并在 switch-case 语句中选择适当的查询?

串联名称_ + en 不起作用。

我使用 spring-boot-starter-data-jpa 2.4.0 版,PostgreSQL JDBC Driver (ver. 42.2.5, JDBC4.2)

【问题讨论】:

  • 我会更改数据库方案,使用翻译表而不是每个翻译的列。这为您提供了更大的灵活性,并且在您添加另一种语言时无需编程
  • 避免动态生成查询的唯一方法是规范化您的数据模型。然后它就像使用where language = 'en' 一样简单。特别是带有“未来将添加更多语言”的部分是一个强有力的指标,表明这些不应该是列,而是行。
  • 为什么不简单地检索所有三列并在您的 Java 代码中选择所需的翻译?除非您需要每秒维持数千个查询,或者如果您在这些列中有数兆字节的文本,否则我认为开销不会太大,会受到伤害。

标签: database postgresql spring-data-jpa internationalization spring-data


【解决方案1】:

有两种方法可以解决这个问题:

  1. 动态创建您的 SQL。这可以像使用字符串连接并使用JdbcTemplate 执行它一样简单。请注意,以这种方式很容易创建 SQL 注入漏洞。虽然您没有在问题中提及它,但您将其标记为 。 Spring Data JPA 没有为此提供任何特殊机制。您必须编写自定义方法。

  2. 解决此问题的正确方法是修复您的架构。当您遇到 99% 的情况下“将添加未来的列 [like this]”时,您的架构设计就会被破坏。修复它,通过在单独的表格中提取这些文本,引用原始表格,加上一个额外的关键字段来划分语言。或者,原始表只包含一个text_key,然后在新表中引用它,这样新表可以保存来自各种来源的文本。您可能不想使用实体引用导航到这些文本,而是使用可能会受益于一些严重缓存的专用查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2015-02-21
    • 2015-03-04
    • 1970-01-01
    相关资源
    最近更新 更多