gpt4 book ai didi

hibernate - 如何将构造函数映射与 Spring JPA 存储库结合使用

转载 作者:行者123 更新时间:2023-12-02 23:37:46 24 4
gpt4 key购买 nike

我有一个 Spring 存储库,如下所示:

import org.springframework.data.repository.Repository;
import org.springframework.stereotype.Component;

import com.test.domain.My;

@Component
public interface MyRepository extends Repository<My, String> {

My findOne(String code);

My findByName(String name);

}

实体类是:

import javax.persistence.ColumnResult;
import javax.persistence.ConstructorResult;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.Table;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

@JsonIgnoreProperties(ignoreUnknown=true)
@Entity
@Table(name="vMy", schema="test")
@SqlResultSetMapping(
name="something",
classes = {
@ConstructorResult(targetClass = My.class,
columns={
@ColumnResult(name = "myCode", type = String.class),
@ColumnResult(name = "myShortName", type = String.class)
}
)
}
)
public class My {

@Id
@Column(name = "myCode")
private final String code;

@Column(name = "myShortName")
private final String name;

public My(String code, String name) {
this.code = code;
this.name = name;
}

@JsonCreator()
public My(@JsonProperty("My_c") String code) {
this.code = code;
this.name = null;
}

public String getCode() {
return code;
}

public String getName() {
return name;
}

@Override
public String toString() {
return "{code: " + code + ", name: " + name + "}";
}
}

调用findOne或findByName时,出现以下错误:

   org.hibernate.InstantiationException: No default constructor for entity 

如何在没有默认构造函数的情况下使用 Spring JPA 存储库?我想保留实例字段、代码和名称,最终的。

最佳答案

我将创建一个名为 MyDto 的单独类,它包含 JSON 内容,但不包含实体注释。也将其字段设为最终字段。

那么你的存储库方法将是这样的:

@Query("SELECT new MyDto(m.code, m.name) FROM My m WHERE m.code = :code")
public MyDto findByCode(@Param("code") String code);

这样,您仅使用 My Entity 类来提供到数据库列的映射,而不是创建 My 的实例。

<小时/>

编辑:另一种方法 ( as detailed here ) 是使用实体类本身作为 DTO。

因此您的查询方法可能如下所示:

@Query("SELECT new My(m.code, m.name) FROM My m WHERE m.code = :code")
public My findByCode(@Param("code") String code);

这样做的优点是不必创建单独的 DTO 类。

关于hibernate - 如何将构造函数映射与 Spring JPA 存储库结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30989315/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com