Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 使用多个语言列查询表_Database_Postgresql_Spring Data Jpa_Internationalization_Spring Data - Fatal编程技术网

Database 使用多个语言列查询表

Database 使用多个语言列查询表,database,postgresql,spring-data-jpa,internationalization,spring-data,Database,Postgresql,Spring Data Jpa,Internationalization,Spring Data,在表object_addresses中,我有3列(3种语言)name_en、name_it、name_sk。今后将添加其他语言的列 是否可以根据所需的语言,以某种方式使查询从对象地址选择名称{en,it,sk}到这样一个表,而无需为每种语言创建3个查询并在switch case语句中选择适当的查询 连接名_uen+en不起作用 我使用spring boot starter数据jpa版本2.4.0,PostgreSQL JDBC驱动程序(版本42.2.5,JDBC4.2)有两种方法可以解决此问题:

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

是否可以根据所需的语言,以某种方式使查询
从对象地址
选择名称{en,it,sk}到这样一个表,而无需为每种语言创建3个查询并在switch case语句中选择适当的查询

连接名_uen+en不起作用


我使用spring boot starter数据jpa版本2.4.0,PostgreSQL JDBC驱动程序(版本42.2.5,JDBC4.2)

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

  • 动态创建SQL。这可以简单到使用字符串连接并使用
    jdbc模板执行它。但是要注意,通过这种方式很容易创建SQL注入漏洞。虽然你在问题中没有提到它,但你却用了。SpringDataJPA没有为此提供任何特殊机制。您必须编写一个自定义方法

  • 解决这个问题的正确方法是修复您的模式。当您在99%的情况下遇到“未来的列[像这样]将被添加”的情况时,您的模式设计被破坏了。通过在一个单独的表中提取这些文本,引用原始表,再加上一个用于划分语言的额外关键字段,可以解决这个问题。或者,原始表只包含一个
    text\u键
    ,然后在新表中引用该键,这样新表就可以保存来自不同来源的文本。您可能不想使用实体引用来导航到这些文本,但是一个专用的查询可能会从一些严重的缓存中受益


  • 我会更改数据库方案,一个用于翻译的表,而不是每个翻译的列。这为您提供了更大的灵活性,并且在添加其他语言时无需编程。避免动态生成查询的唯一方法是规范化数据模型。然后使用
    where language='en'
    就很容易了。特别是带有“将来将添加更多语言”的部分,强烈表明这些语言不应该是列,而应该是行?除非您需要每秒支持数千个查询,或者如果这些列中有兆字节的文本,否则我认为开销不会太大而造成伤害。