- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用Spring和MyBatis,在JSP中连接四个表以获取数据时遇到问题我的模型:
用户:
public class User {
private Long user_id;
private GroupMaster group_id;
private String login_name;
private String password;
private String full_name;
private String full_name_kana;
private String email;
private String tel;
private Date birthday;
private boolean rule;
private String salt;
// getter and setter
}
详细用户:
public class DetailUserVN {
private Long detail_user_vn_id;
private User user_id;
private String code_level;
private Date start_date;
private Date end_start;
private int total;
// getter and setter
}
群主:
public class GroupMaster {
private Long group_id;
private String group_name;
// getter and setter
}
VNMaster:
class VNMaster {
private String code_level;
private String name_level;
// getter and setter
}
UserMapper.java
@Select("SELECT users.user_id, "
+ "users.full_name, "
+ "users.birthday, "
+ "mst_group.group_name, "
+ "users.email, users.tel, "
+ "mst_vn.name_level, "
+ "tbl_detail_user_vn.end_date, "
+ "tbl_detail_user_vn.total "
+ "FROM users "
+ "INNER JOIN tbl_detail_user_vn "
+ "ON tbl_detail_user_vn.detail_user_vn_id = users.user_id "
+ "INNER JOIN mst_vn "
+ "ON mst_vn.code_level = tbl_detail_user_vn.code_level "
+ "INNER JOIN mst_group "
+ "ON mst_group.group_id = users.group_id")
public List<User> getAllUsers();
UserServiceImpl:
public List<User> getAllUsers() {
return userMapper.getAllUsers();
}
用户 Controller :
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value="/login", method=RequestMethod.POST)
public String getAllUser(ModelMap model) {
List<User> listUser = userService.getAllUsers();
model.put("listUser", listUser);
logger.info("list of renter is: " + listUser);
return "getUser";
}
}
getUser.jsp:
<div class="">
<c:if test="${not empty listUser}">
<table border="1" cellpadding="5">
<tr>
<th style="background-color: #e9ecef;">ID</th>
<th style="background-color: #e9ecef;">Họ tên ▲▽</th>
<th style="background-color: #e9ecef;">Ngày sinh</th>
<th style="background-color: #e9ecef;">Phòng ban</th>
<th style="background-color: #e9ecef;">Email</th>
<th style="background-color: #e9ecef;">Phone number</th>
<th style="background-color: #e9ecef;">Tring do ▲▽</th>
<th style="background-color: #e9ecef;">Ngay het han ▲▽</th>
<th style="background-color: #e9ecef;">Tong</th>
</tr>
<c:forEach items="${listUser}" var="user">
<tr>
<td>${user.user_id}</td>
<td>${user.full_name}</td>
<td>${user.birthday}</td>
<td>${user.group_id.group_name}</td>
<td>${user.email}</td>
<td>${user.tel}</td>
<td>${mst_vn.name_level}</td>
<td>${tbl_detail_user_vn.end_date}</td>
<td>${tbl_detail_user_vn.total}</td>
</tr>
</c:forEach>
</table>
</c:if>
</div>
当我构建时,似乎没有发生错误,但无法从数据库获取某些值
示例:
<td>${user.group_id.group_name}</td>
<td>${mst_vn.name_level}</td>
<td>${tbl_detail_user_vn.end_date}</td>
<td>${tbl_detail_user_vn.total}</td>
如何修复此错误并获取相关数据?
更新:
org.apache.ibatis.reflection.ReflectionException: There is no setter for property named 'user' in 'class com.you.springmybatis.model.User'
最佳答案
SQL 查询返回包含所需数据的结果集,但您尚未指定如何将此结果集映射到您使用的对象结构。
让我们考虑一下您尝试显示 user.group_id.group_name
的一个字段值(对于其他字段,情况更为复杂,请参阅下面对此的一些想法)。
组名称的数据在结果集中名称为 group_name
的字段中返回。但 mybatis 不知道应该创建这个字段和类型为 GroupMaster 的对象,并且将 group_name 中的值设置为 group_name该对象的属性。
您需要指定User
和GroupMaster
实体之间关联的映射。不幸的是,当您使用连接通过单个查询选择实体和关联实体时,无法使用 mybatis 中的注释来映射此类关联。但这可以使用 xml 映射来完成。
但是在开始之前,您需要包含参与结果集连接的每个实体的唯一 ID。这意味着您需要包含group_id
等。如果没有这些字段,mybatis将创建重复的实体,但您很可能只想为不同的User
创建一个GroupMaster
code> 实体,如果它们引用 mst_group
表中的相同记录。
您可以在 UserMapper.xml
中创建 xml 映射,该映射与 UserMapper
接口(interface)位于同一包中,如下所示:
<resultMap id="userMap" type="User">
<id property="user_id" column="user_id"/>
<result property="full_name" column="full_name"/>
<result property="birthday" column="birthday"/>
<association property="group_id" javaType="GroupMaster">
<id property="group_id" column="group_id"/>
<result property="group_name" column="group_name"/>
</association>
</resultMap>
然后你可以在映射器中引用这个resultmap:
@ResultMap("com.you.mapper.UserMapper.userMap")
@Select("SELECT users.user_id, "
+ "users.full_name, "
+ "users.birthday, "
+ "mst_group.group_name, "
+ "users.email, users.tel, "
+ "mst_vn.name_level, "
+ "tbl_detail_user_vn.end_date, "
+ "tbl_detail_user_vn.total "
+ "FROM users "
+ "INNER JOIN tbl_detail_user_vn "
+ "ON tbl_detail_user_vn.detail_user_vn_id = users.user_id "
+ "INNER JOIN mst_vn "
+ "ON mst_vn.code_level = tbl_detail_user_vn.code_level "
+ "INNER JOIN mst_group "
+ "ON mst_group.group_id = users.group_id")
public List<User> getAllUsers();
让我们详细了解关联映射的工作原理:
<resultMap id="RM" type="A">
<association property="pB" javaType="B">
<id property="id" column="b_id"/>
<result property="name" column="b_name"/>
</association>
</resultMap>
这指定对于每个结果行(表示A
类型的对象),应创建一个B
类型的对象及其属性id
和 name
应分别从 b_id
和 b_name
列中设置。
因此,上面的映射示例指定字段 group_id
和 group_name
应放入 GroupMaster
类型的对象的属性中,并且该对象应分配给 User
实体的 group_id
属性。
几点说明:
User
中的group_id
字段实际上存储的不是组的ID,而是实际的对象,因此应该将其重命名为组
。fullName
等,而不是 full_name
。将联接映射到 mst_vn
和 tbl_detail_user_vn
时存在问题,因为 User
中没有表示此关联的字段。您需要考虑您希望对象树应该如何表示您想要从数据库中获取的数据。
对于tbl_detail_user_vn
,您可能需要向User
添加一个字段:
private DetailUserVN detail;
然后您将能够使用与 GroupMaster
相同的方法来映射此关联。
关于java - 如何使用 Spring mvc 和 MyBatis 获取数据连接四个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57947339/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!