如何将基元的ArrayList映射到单个列? [英] How to map an ArrayList of primitives to a single column?

查看:174
本文介绍了如何将基元的ArrayList映射到单个列?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有以下情况:

Object Car有一个价格的ArrayList,它们都是数字。 Hibernate有可能将所有价格保存在一个列中吗?我知道这违反了第一种正常形式,但可能会出现这样的情况,您不希望它们被保存在单独的表格中,就像它在一对多或多对多关系中经典地完成一样。



在JDO中,我会通过将ArrayList保存在BLOB列中来轻松完成此操作。



一些有用的相关SOF问题:原始类型的ArrayList和使用Hibernate映射ArrayList



任何想法都将得到高度赞赏!

解决方案

我知道这是一个老问题,但对于任何想在JPA上下文中执行此操作的人来说,您都可以这样做

  import org.apache.commons.lang3.StringUtils; 
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@Converter
public class IntArrayToStringConverter implements AttributeConverter< List< Integer> String> {
@Override
public String convertToDatabaseColumn(List< Integer> attribute){
返回属性== null? null:StringUtils.join(attribute,,);
}

@Override
public List< Integer> convertToEntityAttribute(String dbData){
if(StringUtils.isBlank(dbData))
return new ArrayList<>();

try(Stream< String> stream = Arrays.stream(dbData.split(,))){
return stream.map(Integer :: parseInt).collect(Collectors。 toList());
}
}
}

然后使用它这在你的实体

  @Entity 
公共类SomeEntity
{

@I $
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

@Column
@Convert(converter = IntArrayToStringConverter.class)
private List< Integer>整数;

...
}

Enjoy !!!


Let's say I have the following situation:

Object Car has an ArrayList of prices, which are all numbers. Is it possible in Hibernate to save all the prices in a single column? I know this violates the first normal form but there might be cases when you don't want them to be saved in a separate table like it's classically done in One-To-Many or Many-To-Many relationships.

In JDO I'd do this easily by saving the ArrayList in a BLOB column.

Some useful related SOF questions: ArrayList of primitive types in Hibernate and Map ArrayList with Hibernate .

Any idea will be highly appreciated!

解决方案

I know this is an old question but for anyone trying to do this in a JPA context you can do this

import org.apache.commons.lang3.StringUtils;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@Converter
public class IntArrayToStringConverter implements AttributeConverter<List<Integer>,String>{
    @Override
    public String convertToDatabaseColumn(List<Integer> attribute) {
        return attribute == null ? null : StringUtils.join(attribute,",");
    }

    @Override
    public List<Integer> convertToEntityAttribute(String dbData) {
        if (StringUtils.isBlank(dbData))
            return new ArrayList<>();

        try (Stream<String> stream = Arrays.stream(dbData.split(","))) {
            return stream.map(Integer::parseInt).collect(Collectors.toList());
        }
    }
}

Then to use it something like this in your entity

@Entity
public class SomeEntity
{

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Integer id;

   @Column
   @Convert(converter = IntArrayToStringConverter.class)
   private List<Integer> integers;

   ...
}

Enjoy !!!

这篇关于如何将基元的ArrayList映射到单个列?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆