VARCHAR
我的数据库中有一个字段,该字段的值为val1,val2,val3
.
是否可以ArrayList
使用逗号作为拆分分隔符将其设置为实体的属性?
如果您使用JPA 2.1,那么您可以创建一个AttributeConverter
:
@Converter public class StringListConverter implements AttributeConverter, String> { @Override public String convertToDatabaseColumn(List
list) { // Java 8 return String.join(",", list); // Guava return Joiner.on(',').join(list); } @Override public List convertToEntityAttribute(String joined) { return new ArrayList<>(Arrays.asList(joined.split(","))); } }
您可以在实体中使用此转换器:
@Column @Convert(converter = StringListConverter.class) private Liststrings;
对于JPA 2.1之前,您可以手动执行此操作:
@Entity private MyEntity { ... private String strings; public ListgetStrings() { return Arrays.asList(strings.split(",")); } public void setStrings(List list) { strings = String.join(",", list); } }
我裹Arrays.asList
在ArrayList
转换器中的,因为结果是存储在属性和任何改变这一名单将被写入到数据库中-因此,我需要一个多变的列表(我不能添加任何的结果Arrays.asList
).在2.1之前的解决方案中,结果与属性无关,并且可更改列表不会与属性同步.
要查询包含此类属性中特定项的实体,请在此处查看我的答案
是的,这是可能的.
使用Hibernate 4.3.x +你可以定义一个AttributeConverter
虽然我很确定这对早期的Hibernate版本不适用,因为它的List
类型.请参阅此示例:http://www.thoughts-on-java.org/jpa-21-how-to-implement-type-converter/
实现此功能的另一种方法是实现自定义UserType
并使用注释字段/ getter org.hibernate.annotations.Type
.以下是一个很好的例子:http://blog.xebia.com/understanding-and-writing-hibernate-user-types/
JPA兼容的另一种方法是有两个字段,List
用javax.persistence.Transient
和注释,String
然后你自己管理这两个字段PrePersist
和PreUpdate
监听器之间的状态同步.这里是一个使用监听器的示例:http://alexandregama.org/2014/03/23/entity-listeners-and-callback-methods-jpa/