当前位置: 首页 > 知识库问答 >
问题:

Mybatis-从SELECT返回包含Hashmap的对象

司马辉
2023-03-14

我有class-user,它看起来如下所示:

public class User extends GeneralDto {

    private String userId;
    private String email;
    private String firstName;
    private String lastName;
    private long creationTimestamp;
    private long updateTimestamp;
    private List<String> tags;
    private HashMap<String, String> attributes;
    private HashMap<String, String> accounts;

    get and set to all + equals + hashcode.
}

这两个哈希映射包含未知的键和字符串类型的值(它们给我带来了很多麻烦)。

我已经使用insert方法将该类映射到表中。并将其映射到下表方案:

User (userIdentity, userId, email, firstName, lastName, creationTimestamp, updateTimestamp)

UserAttribute (userIdentity, attributeName, attributeValue, creationTimestamp, updateTimestamp)

UserTag (userIdentity, tagName, creationTimestamp, updateTimestamp)

UserAccount (userIdentity, accountIdentity, role, creationTimestamp, updateTimestamp)
<select id="getUser" parameterType="com.intel.aa.iot.mybatis.UserResultHandler" resultMap="userResultMap" resultOrdered="true">
    SELECT
        U.userId as userId,
        U.email as email,
        U.firstName as firstName,
        U.lastName as lastName,
        U.creationTimestamp as creationTimestamp,
        U.updateTimestamp as updateTimestamp,
        UT.tagName as tagName,
        UAT.attributeName as attributeName,
        UAT.attributeValue as attributeValue,
        A.accountId as accountId,
        UAC.role as role
    FROM User U
        LEFT OUTER JOIN UserTag UT ON U.userIdentity = UT.userIdentity
        LEFT OUTER JOIN UserAttribute UAT ON U.userIdentity = UAT.userIdentity
        LEFT OUTER JOIN UserAccount UAC ON U.userIdentity = UAC.userIdentity
        LEFT OUTER JOIN ACCOUNTS A ON UAC.accountIdentity = A.accountIdentity
    WHERE U.userId = #{userKey.userId}
public static class UserProperties {
    private User user;
    private List<String> attributeNames;
    private List<String> attributeValues;
    private List<String> accountIds;
    private List<String> accountRoles;

    get and set to all
}
<resultMap id="userResultMap" type="com.intel.aa.iot.mybatis.UserMapper$UserProperties">
    <association property="user" javaType="com.intel.aa.iot.dto.User">
        <id property="userId" column="userId"/>
        <result property="email" column="email"/>
        <result property="firstName" column="firstName"/>
        <result property="lastName" column="lastName"/>
        <result property="creationTimestamp" column="creationTimestamp"/>
        <result property="updateTimestamp" column="updateTimestamp"/>
        <collection property="tags" javaType="java.util.ArrayList" column="tagName" ofType="java.lang.String"/>
    </association>
    <collection property="attributeNames"  javaType="java.util.ArrayList" column="attributeName" ofType="java.lang.String"/>
    <collection property="attributeValues" javaType="java.util.ArrayList" column="attributeValue" ofType="java.lang.String"/>
    <collection property="accountIds" javaType="java.util.ArrayList" column="accountId" ofType="java.lang.String"/>
    <collection property="accountRoles" javaType="java.util.ArrayList" column="role" ofType="java.lang.String"/>
</resultMap>

我有什么方法来处理这些hasmaps?

谢谢!

共有1个答案

葛兴发
2023-03-14

在过去的几年里,我也遇到过同样的问题,但我还没有找到一个理想的解决方案。归根结底,问题是mybatis不允许您指定hashmap的键-它使用结果属性名作为键。

我所采用的两种方法远不完美,但我将在这里概述它们,以防它们对您有用:

>

  • 使用结果处理程序。我看到你说你已经试过了,但是只得到了第一个值--有没有机会分享你的代码?结果处理程序在查询中每返回一行调用一次,因此您不希望每次都创建一个新对象。只有在没有与该行中的ID匹配的对象时,您才希望创建一个对象,然后基于下面的行迭代地构建它。

    将名称和值构建为HashMap列表,然后使用select拦截器(mybatis插件)调用对象内部的方法来构建真正的HashMap。为此,在结果映射中,您需要在HashMap类型的关联下指定名称和值结果。然后Mybatis会把这个变成一个列表,看起来像:

  •  类似资料:
    • 问题内容: 在PHP中,如何从包含的脚本返回到包含它的脚本? IE浏览器: 1-主脚本2-应用程序3-包含 基本上,我想从3返回2,return()不起作用。 代码2-应用 问题答案: includeme.php: main.php: 也给出相同的结果 这是PHP鲜为人知的功能之一,但是对于设置非常简单的配置文件来说可能会很好。

    • 我尝试了一些变体,但没有运气返回GraphQL中的地图。因此,我有以下两个对象: 我的模式如下: 有人能告诉我如何实现这一点,以便GraphQL神奇地处理这一点或另一种方法。 非常感谢!

    • 在我的代码中,我有一个ArrayList contentChecklist,其中存储HashMap对象。在列表中添加所有HashMap对象之后,如果我从列表中获取最后一个HashMap对象并将其存储在新的HashMap对象(CheckListMaptemp)中,并使用

    • 我已经编写了在android studio上显示可扩展列表视图的代码。以下是ExplandableListView的代码: 这是执行操作的方法: 它在函数定义中的“groupPosition”处显示警告: 当鼠标悬停在上面时,会显示

    • 好日子,我被困在弄清楚如何从列表中获取单个对象,我做了谷歌,但所有主题都显示了如何返回带有排序对象或类似内容的。 我有一个 在java中,我会这样写 我怎样才能在kotlin中获得同样的结果?

    • 我有一个包含通过构造函数创建的对象的hashmap。这些对象在hashmap中 我有一个比较两个数组的函数。一个数组是手动创建的,但第二个数组是通过一个方法创建的。我只需要来自HashMap的值。 我被这种方法困住了... 如果取出.toArray(),将得到一个“无法从集合 转换为brick” 如果将.toArray()更改为.toString(),则会得到一个“无法从String转换为bric