【问题标题】:How to get a JPA-persisted String[] column by ResultSet#getString() in JDBC?如何通过 JDBC 中的 ResultSet#getString() 获取 JPA 持久化的 String[] 列?
【发布时间】:2011-09-28 11:14:40
【问题描述】:

我想在单个 DB 列中存储多个复选框值。我不想与@OneToMany 存储在单独的表中。

这是 JPA 实体:

@Entity
@Table(name="COOK")
...
@Column(name="ARRAY_FOOD" )
private String[] arrayFood;
...getter and setters...

这里是复选框值 (JSF):

<h:selectManyCheckbox value="#{foodBean.selectedModel.arrayFood}" layout="lineDirection">
    <f:selectItem itemLabel="FISH"       itemValue="FISH"           />
    <f:selectItem itemLabel="SOUP"       itemValue="SOUP"           />
    <f:selectItem itemLabel="CAKE"       itemValue="CAKE"           />
    <f:selectItem itemLabel="1/2 WATER"  itemValue="1/2 WATER"      />
    <f:selectItem itemLabel="BANANA 1KG" itemValue="BANANA 1KG"     />
</h:selectManyCheckbox>

JPA 存储提交的检查值如下:

Column Name Data Type   Sample Data
----------------------------------------
ARRAY_FOOD  RAW (255)   ACED0005757200135B4C6A6176612E6C616E672E537472696E673BADD256E7E91D7B4702000078700000000174000141

如何在另一个程序中通过ResultSet 获取原始数组?

String array = rs.getString("ARRAY_FOOD");  // ???????????

或者我怎样才能像在其他程序中那样以可理解的格式对其进行格式化,我可以用“;”之类的字符来分割它:

FISH;SOUP;BANANA 1KG

【问题讨论】:

  • 我不想与 OneToMany 存储在单独的表中:你真的应该重新考虑这一点。否则,您最终会得到一个非规范化且难以使用的数据模型。
  • 感谢@BalusC。原因是我有大量数据,每个CookEntity 至少有10 个Foods。程序应该很快,加入会影响性能。我不能有一个列FOOD (in DB)ARRAY_FOOD (Not in DB),它会以X;Y;Z; 格式写入FOOD 并将其读入数组ARRAY_FOOD。所以在 JSF 中我将使用 ARRAY_FOOD 但在写入时它会写入 DB 的 FOOD 列?

标签: arrays jpa jdbc entity


【解决方案1】:

默认情况下,不支持数据库类型的可序列化类型会被序列化。您需要使用 Java 序列化将这些类型从 JPA 之外获取。

如果使用 EclipseLink,您可以改用 @Converter 来转换数组。

您还可以使用 get/set 方法来转换值,请参阅,

http://en.wikibooks.org/wiki/Java_Persistence/Basic_Attributes#Conversion

【讨论】:

    猜你喜欢
    • 2011-06-07
    • 2023-03-11
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多