JFinal 向 postgreSQL写入数组型数据的问题

九龙湖 发布于 2014/10/09 16:50
阅读 1K+
收藏 0

@JFinal 你好,想跟你请教个问题:

JFinal 一般的数据写到数据库中没有什么问题,但是如果要写入一个数组型的字段就发现没有专门的数组接口,其它变通的方法还没有发现,请问这类问题一般怎么解决的?

加载中
0
JFinal
JFinal
    具体是什么数据呢? 贴出要写入的数组和相关示范性代码来
九龙湖
九龙湖
回答如下
0
九龙湖
九龙湖

数据库的建表代码:

CREATE TABLE test_info
(
  id serial NOT NULL,
  user_id integer NOT NULL,
  name text[] NOT NULL,
  CONSTRAINT test_info_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE test_info
  OWNER TO postgres;

要写入的数据大概是这样的:

String[] nameTest = {"zhang","li"};

如果要向这个表的name字段写入nameTest,Model中好像没有专门的数组写入的接口,该怎么弄?

0
JFinal
JFinal

引用来自“九龙湖”的评论

数据库的建表代码:

CREATE TABLE test_info
(
  id serial NOT NULL,
  user_id integer NOT NULL,
  name text[] NOT NULL,
  CONSTRAINT test_info_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE test_info
  OWNER TO postgres;

要写入的数据大概是这样的:

String[] nameTest = {"zhang","li"};

如果要向这个表的name字段写入nameTest,Model中好像没有专门的数组写入的接口,该怎么弄?

postgresql 不熟,直接试试这样的代码:

YourModel m = new YourModel();
String[] nameTest = {"zhang", "li"};
m.set("name", nameTest);
m.save();



九龙湖
九龙湖
这个方法好像不行,使用之后会有错误,具体的错误信息如下
0
九龙湖
九龙湖


com.jfinal.plugin.activerecord.ActiveRecordException: org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of [Ljava.lang.String;. Use setObject() with an explicit Types value to specify the type to use.
at com.jfinal.plugin.activerecord.Model.save(Model.java:324)
at testDatabase(DialogServiceManaer.java:359)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:55)
at com.jfinal.core.ActionHandler.handle(ActionHandler.java:73)
at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1307)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:453)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:560)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1072)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1006)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handle(Server.java:365)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485)
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:926)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:988)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:635)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
at java.lang.Thread.run(Thread.java:662)
Caused by: org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of [Ljava.lang.String;. Use setObject() with an explicit Types value to specify the type to use.
at org.postgresql.jdbc2.AbstractJdbc2Statement.setObject(AbstractJdbc2Statement.java:1916)
at org.postgresql.jdbc3g.AbstractJdbc3gStatement.setObject(AbstractJdbc3gStatement.java:36)
at org.postgresql.jdbc4.AbstractJdbc4Statement.setObject(AbstractJdbc4Statement.java:47)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.setObject(NewProxyPreparedStatement.java:365)
at com.jfinal.plugin.activerecord.dialect.Dialect.fillStatement(Dialect.java:68)
at com.jfinal.plugin.activerecord.Model.save(Model.java:318)
... 32 more
0
开源中国隔壁老王
开源中国隔壁老王
自己写sql 保存吧
九龙湖
九龙湖
恩,这个是没有办法的办法,最好是能在JFinal框架内解决,减轻点维护的压力
0
iginx
iginx
不用通用的数据类型
九龙湖
九龙湖
在下愚钝,兄台能不能说详细点?
0
iginx
iginx

不是通用的数据类型,你可以使用通用的数据类型

直接把你的那个name设置成字符型,存储的时候直接把JSON转字符串不就成了

返回顶部
顶部