spring-data-jpa 如何使用JPA获取非相关实体

im9ewurl  于 2022-11-10  发布在  Spring
关注(0)|答案(2)|浏览(269)

我有两个实体

@Entity
public class Language {

@Id
@GeneratedValue
private int id;

private String name;

private String isoCode;

}

并且所述另一实体

@Entity
public class MainEntity {

@Id
@GeneratedValue
private int id;

private String anotherField;

private Language language;  //(here I want to return the full entity)

}

实体没有数据库关系,只有一个字符串字段。现在,我想查询MainEntity,但我想获取完整的实体
比如说
语言Name
| | 价值|
| - -|- -|
| 标识符|一个|
| 姓名|英语|
| 等代号|英文版|
主要实体
| | 价值|
| - -|- -|
| 标识符|一种|
| 姓名|某某|
| 语言|英文版|
我有资料库

public interface MainRepository extends JpaRepository<MainEntity, Integer>{

User findAll();
}

但我希望当我在主实体上进行搜索时,它会给我整个语言实体
例如,
语言.getName()

zz2j4svz

zz2j4svz1#

使用本机查询读取JPA对象?请参阅这个简化的示例,在该示例中可以使用任何有效的本机SQL查询语法。
您可以将Language getLanguage()函数放到MainEntity类中。

String sql = "Select * From MyEntityTable Where id between (?1 and ?2)";
Query query = entityMgr.createNativeQuery(sql, MyEntity.class);
query.setParameter(1, 1001);
query.setParameter(2, 2002);
List<MyEntity> list = query.getResultList();
0md85ypi

0md85ypi2#

如果您不想在MainEntityLanguage之间建立关系,则必须进行本机查询。(因为您不能同时进行jpql查询,因为您至少应该在MainEntity中具有String language,以便在Language中的String isoCode上进行连接,但据我所知,我认为您不希望这样做)。因此,您必须执行一个本机查询,返回一个here所述的接口

public interface IntermediateObject {
    int getId();

    String getName();

    int getLanguageId();

    String getLanguageName();

    String getIsoCode();
}

在存储库中:

@Query("select m.id as id, m.name as name, l.id as languageId, l.name as languageName, l.isoCode as isoCode MainEntity m join Language l on m.language = l.isoCode", native=true)
List<IntermediateObject> someMethod();

在MainEntity或更好的另一个dto中,你必须声明一个构造函数:

public class AnotherDto {

    private int id;
    private String name;
    private LanguageDto language;

    public AnotherDto(int id, String name, int languageId, String languageName, String isoCOde) {
        this.id = id;
        this.name = name;
        this.language = new LanguageDto(languageId, languageName, isoCode);
    }

}
public class LanguageDto {
    private int id;
    private String name;
    private String isoCode;

    public LanguageDto(int id, String name, String isoCode) {
        this.id;
        this.name = name;
        this.isoCode = isoCode;
    }
}

在服务层中,您必须从IntermediateObject构造AnotherDto

public List<AnotherDto> someMethod() {
    return repository.someMethod().stream().map(i -> new AnotherDto(i.getId(), i.getName(), i.getLanguageId(), i.getLanguageName(), i.getIsoCode())).collect(Collectors.toList());
}

现在已经填充了语言对象。
无论如何,我建议Map实体,而不是做这一切。

相关问题