如何解决不会持久化支持实体到哈希图转换
出色的持久性支持实体到键值对的转换,EntityView字段的名称也可以与实际Entity的名称不同
@Entity
@Table(name = "users")
public class User {
@Column
private String name;
@OneToMany(mappedBy = "user",cascade = CascadeType.ALL)
private Set<UserPropertyValue> userPropertyValues = new HashSet<>();
}
@Entity
@Table(name = "user_property_values")
public class UserPropertyValue {
@Column
private String value;
@ManyToOne
JoinColumn(name = "properties_id")
private Property property;
}
@Entity
@Table(name = "properties")
public class Property {
@Id
private Long id;
@Column
private String name;
}
我想要EntityView这样的东西。
@EntityView(User.class)
interface UserView {
private String getUserName();
private HashMap<String,String> userPropertyValues();
}
基本上名称是此处的用户名,并且 userPropertyValues 应该是包含以下内容的HashMap:
- 键作为属性-> 名称
- 值为属性值-> 值
它是否还有助于创建自定义转换器,例如我想将LocalDateTime更改为具有各种不同格式/样式的String?
解决方法
当然,您可以使用@Mapping
批注指定JPQL.Next映射,如下所示:
@EntityView(User.class)
interface UserView {
@Mapping("name")
String getUserName();
Set<UserPropertyValueView> getUserPropertyValues();
}
@EntityView(UserPropertyValue.class)
interface UserPropertyValueView {
@Mapping("property.name")
String getPropertyName();
String getValue();
}
如果您真的想要地图,还可以使用以下内容:
@EntityView(User.class)
public abstract class UserView {
private final Map<String,String> values;
public UserView(@Mapping("userPropertyValues") Set<UserPropertyValueView> values) {
this.values = values.stream().collect(Collectors.toMap(UserPropertyValueView::getPropertyName,UserPropertyValueView::getValue))
}
@Mapping("name")
public abstract String getUserName();
public Map<String,String> getUserPropertyValues() {
return values;
}
}
@EntityView(UserPropertyValue.class)
interface UserPropertyValueView {
@Mapping("property.name")
String getPropertyName();
String getValue();
}
通过注释映射地图关键字将在目前正在使用的最终1.5.0版本中引入:https://github.com/Blazebit/blaze-persistence/issues/401
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。