如何在IBatis的选择查询中发送列表?

时间:2015-05-22 12:56:36

标签: java postgresql ibatis

我正在使用Java 1.7, IBatis and postgreSQL

我有StudentVO

import java.util.List;
    public class StudentVO {

        private Long studentId;
        private String studentName;
        private List<Long> studentFriendNums;

        //getters and setters
    }

postgreSQL中的Functionget_party_details(VARIADIC bigint[])

CREATE OR REPLACE FUNCTION get_party_details(VARIADIC bigint[])
  RETURNS TABLE(studentid bigint,studentName character varying, amtPaid numeric) AS
$BODY$
     DECLARE
        SQL VARCHAR;
BEGIN
    RETURN QUERY
        SELECT
             STU.student_id   as "Student ID"
            ,STU.student_name as "Student Name"
            ,STU.amt_paid     as "Amount Paid"

        FROM    STUDENT     STU

            WHERE STU.STUDENT_ID IN ( SELECT $1[I] FROM GENERATE_SUBSCRIPTS($1, 1) G(I));
END;

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000;

我的函数返回以下结果:

  

从get_party_details(101,102,103,104)中选择*;

StudentId  Student Name     Amt Paid
101          JOHN           428000.00
102          SMITH          275405.00
103          JACKSON        109250.00
104          LOVELESS       63200.00

我的queries.xml

<select id="get_party_details" parameterType="StudentVO" 
        statementType="PREPARED" resultMap="partyMap">
            select * from get_party_details(#{studentFriendNums})
</select>

    <resultMap type="StudentVO" id="partyMap">
        <result property="studentId"            column="studentid" />
        <result property="studentName"          column="studentname" />
        <result property="amtPaid"              column="amtpaid" />
    </resultMap>

如果我使用上面的Select语句我得到以下例外:

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.IllegalStateException: Type handler was null on parameter mapping for property 'studentFriendNums'.  It was either not specified and/or could not be found for the javaType / jdbcType combination specified.
### Cause: java.lang.IllegalStateException: Type handler was null on parameter mapping for property 'studentFriendNums'.  It was either not specified and/or could not be found for the javaType / jdbcType combination specified.

任何帮助/建议?

编辑1:我尝试了一个foreach循环,但没有让我摆脱这个问题。

<select id="get_party_details" parameterType="StudentVO" statementType="PREPARED" resultMap="partyMap">
        select * from get_party_details(
        <foreach item="friends" index="index" collection="studentFriendNums"
            open="(" separator="," close=")">
            #{friends}
        </foreach>
        )
    </select>

<foreach/>的异常:

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.postgresql.util.PSQLException: ERROR: function get_party_details(record) does not exist
  Hint: No function matches the given name and argument types. You might need to add explicit type casts.
  Position: 15
### The error may exist in com/myblog/queries.xml
### The error may involve com.myblog.StudentDAO.get_party_details-Inline
### The error occurred while setting parameters
### SQL: select * from epc.get_party_details(    (      ?    ,     ?    ,     ?    ,     ?    )    )
### Cause: org.postgresql.util.PSQLException: ERROR: function get_party_details(record) does not exist
  Hint: No function matches the given name and argument types. You might need to add explicit type casts.
  Position: 15

编辑2:我的Ibatis版本为3.2.3

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.myblog.StudentDTO">

    <select id="get_party_details" parameterType="StudentVO" 
      statementType="PREPARED" resultMap="partyMap">
        select * from get_party_details
     <iterate property="studentFriendNums" conjunction="," open = "(" close = ")">
            #studentFriendNums[]#
     </iterate>
</select>

    <resultMap type="StudentVO" id="partyMap">
        <result property="studentId"            column="studentid" />
        <result property="studentName"          column="studentname" />
        <result property="amtPaid"              column="amtpaid" />
    </resultMap>

</mapper>

2 个答案:

答案 0 :(得分:0)

您可以尝试迭代标记:

<select id="get_party_details" parameterType="StudentVO" 
      statementType="PREPARED" resultMap="partyMap">
        select * from get_party_details
     <iterate property="studentFriendNums" conjunction="," open = "(" close = ")">
            #studentFriendNums[]#
     </iterate>
</select>

<resultMap type="StudentVO" id="partyMap">
    <result property="studentId"            column="studentid" />
    <result property="studentName"          column="studentname" />
    <result property="amtPaid"              column="amtpaid" />
</resultMap>

答案 1 :(得分:0)

你可以使用foreach:

   <select id="get_party_details" parameterType="StudentVO" 
            statementType="PREPARED" resultMap="partyMap">
                select * from get_party_details
                <foreach item="item" index="index" collection="studentFriendNums"
                    open="(" separator="," close=")">
                #{item}
               </foreach>
    </select>

刚看到你的第一个编辑,你不需要在foreach之前和之后打开和关闭括号。参数打开和关闭为你做。