我有一个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存储库而没有默认构造函数?我想保留实例字段,代码和名称,最终。
答案 0 :(得分:3)
我会创建一个名为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)是将Entity类本身用作DTO。
所以你的查询方法可能如下所示:
@Query("SELECT new My(m.code, m.name) FROM My m WHERE m.code = :code")
public My findByCode(@Param("code") String code);
这样做的好处是无需创建单独的DTO类。