Java 使用spring数据jpa的关系条件加载

Java 使用spring数据jpa的关系条件加载,java,spring,hibernate,jpa,spring-data,Java,Spring,Hibernate,Jpa,Spring Data,我正在开发一个多语言应用程序,我的表也是为此而设计的。例如,我有这样一个国家班: @Entity @Table(name = "province") public class Province { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @ManyToOne @JoinColumn(name = "country_id", nullable = false

我正在开发一个多语言应用程序,我的表也是为此而设计的。例如,我有这样一个国家班:

@Entity
@Table(name = "province")
public class Province {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "country_id", nullable = false)
    private Country country;

    @OneToMany
    @JoinColumn(name = "province_id")
    private List<ProvinceTranslation> translations;
}

@Entity
@Table(name = "province_translation")
public class ProvinceTranslation {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    private Language language;

    @ManyToOne
    @JoinColumn(name = "province_id")
    private Province province;
}
@实体
@表(name=“省”)
公营省{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@许多酮
@JoinColumn(name=“country\u id”,null=false)
私人国家;
@独身癖
@JoinColumn(name=“省\省id”)
私人名单翻译;
}
@实体
@表(name=“省\单位翻译”)
公共类省级翻译{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
私有字符串名称;
私人语言;
@许多酮
@JoinColumn(name=“省\省id”)
私营省;
}

我希望
translations
字段加载仅使用指定语言的翻译,以及使用指定语言的国家/地区字段加载翻译(
country
类有一个
CountryTranslation
列表!)。我不想编写查询,我想让spring数据与我明确指定的语言建立jpa加载关系。

在这种情况下,似乎需要编写一点jpa查询

由于缺少
countryTranslation
类,我将重点放在
Province
类上

语言
类也是未知的,可能这是一个
枚举
类,如下所示:

@Entity
@Table(name = "province")
public class Province {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "country_id", nullable = false)
    private Country country;

    @OneToMany
    @JoinColumn(name = "province_id")
    private List<ProvinceTranslation> translations;
}

@Entity
@Table(name = "province_translation")
public class ProvinceTranslation {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    private Language language;

    @ManyToOne
    @JoinColumn(name = "province_id")
    private Province province;
}
公共枚举语言{未知、德语、英语、西班牙}

为了避免加载实体的所有翻译,您必须在从数据库获取实体时根据给定语言选择翻译。我更喜欢利用spring存储库(我希望您已经参与其中)。在
ProvinceRepository
中声明如下

public interface provider存储库扩展了crudepository{
...
}
您必须提供所需的查找或计数方法

要获得具有特定翻译的所有省份的列表,您可以在
ProvinceRepository
中声明类似于此的函数:

@Query(“从省p选择新的org.your.package.goes.here.Province(p.id,p.country,pt.name)内部连接p.translations pt,其中pt.language=?1”)
列表findAllWithTranslation(语言);
要使其工作,必须存在一个接受三个参数
id、country、name
的构造函数。
name
参数可以设置为省类的一个新的
translation
属性,分别是创建的
对象。如果
语言
类确实是
枚举
类,则必须将
@枚举
注释添加到语言字段中


尽管如此,我相信翻译字符串的提供应该在国际化库(i18n)的帮助下更好地完成。

在这种情况下,似乎需要编写一点JPA查询

由于缺少
countryTranslation
类,我将重点放在
Province
类上

语言
类也是未知的,可能这是一个
枚举
类,如下所示:

@Entity
@Table(name = "province")
public class Province {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "country_id", nullable = false)
    private Country country;

    @OneToMany
    @JoinColumn(name = "province_id")
    private List<ProvinceTranslation> translations;
}

@Entity
@Table(name = "province_translation")
public class ProvinceTranslation {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    private Language language;

    @ManyToOne
    @JoinColumn(name = "province_id")
    private Province province;
}
公共枚举语言{未知、德语、英语、西班牙}

为了避免加载实体的所有翻译,您必须在从数据库获取实体时根据给定语言选择翻译。我更喜欢利用spring存储库(我希望您已经参与其中)。在
ProvinceRepository
中声明如下

public interface provider存储库扩展了crudepository{
...
}
您必须提供所需的查找或计数方法

要获得具有特定翻译的所有省份的列表,您可以在
ProvinceRepository
中声明类似于此的函数:

@Query(“从省p选择新的org.your.package.goes.here.Province(p.id,p.country,pt.name)内部连接p.translations pt,其中pt.language=?1”)
列表findAllWithTranslation(语言);
要使其工作,必须存在一个接受三个参数
id、country、name
的构造函数。
name
参数可以设置为省类的一个新的
translation
属性,分别是创建的
对象。如果
语言
类确实是
枚举
类,则必须将
@枚举
注释添加到语言字段中

尽管如此,我相信翻译字符串的提供应该在国际化库(i18n)的帮助下更好地完成.

我认为您可以添加到省实体并添加国家/地区和省翻译,但您仍然错过了国家/地区翻译,因此我建议使用比jpa更灵活、更容易满足此要求的本地查询。我认为您可以添加到省实体并添加国家/地区和省翻译,但您仍然错过了countryTranslation所以我的建议是使用本机查询,它比jpa更灵活、更容易满足这一要求