需求说明
这几天接了个新需求,说是将不同的对象返回到同一个List集合内并在页面展示。
思路
首先是2张不同的表,其次2张表也没啥关联,之后就是这2张表有相似的字段值,仔细的考虑了一下,还是用视图来做比较方便。以前没用过视图,为了验证一下准确性,先在自己的测试环境做个测试看看。
具体实现
1.建表
测试表1:TEST_A
create table TEST_A
(
a_id varchar(20) primary key,
a_name varchar(20),
a_age varchar(2),
a_address varchar(20),
a_phone varchar(20),
a_differ varchar(20)
)
测试表2:
create table TEST_B
(
b_id varchar(20) primary key,
b_name varchar(20),
b_age varchar(2),
b_address varchar(20),
b_phone varchar(20),
b_same varchar(20)
)
2.插入数据
insert into TEST_A values('a_1','aa','10','上海','111111','小学生');
insert into TEST_A values('a_2','ab','18','北京','222222','高中生');
insert into TEST_A values('a_3','ac','16','天剑','122222','国中生');
insert into TEST_A values('a_4','ad','22','上海','333333','大学生');
insert into TEST_A values('a_5','ae','30','合肥','333444','AE工程师');
insert into TEST_A values('a_6','af','25','广州','444444','打工仔');
insert into TEST_B values('b_1','ba','10','上海','111111','玩游戏');
insert into TEST_B values('b_2','bb','18','北京','222222','看书考试');
insert into TEST_B values('b_3','bc','16','天剑','122222','开心混日子');
insert into TEST_B values('b_4','bd','22','上海','333333','纠结的小混球');
insert into TEST_B values('b_5','be','30','合肥','333444','剪辑开始');
insert into TEST_B values('b_6','bf','25','广州','444444','一个打5个');
3.建视图
测试视图:TEST_ALL
-- 将相似的字段放到同一张视图中,查询2张表所有的数据
create or replace view TEST_ALL
as
(
select a.a_id id, a.a_name name, a.a_age age, a.a_address address, a.a_phone tel from TEST_A a
union
select b.b_id id, b.b_name name, b.b_age age, b.b_address address, b.b_phone tel from TEST_B b
)
查询视图数据如下图:
4.建对象TestView
@Entity
@Subselect(value = "TEST_ALL")
public class TestView {
// id
@Id
@Column(name = "ID")
private String id;
// name
@Column(name = "NAME")
private String name;
// age
@Column(name = "AGE")
private String age;
// address
@Column(name = "ADDRESS")
private String address;
// tel
@Column(name = "TEL")
private String tel;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public TestView() {
}
@Override
public String toString() {
return "TestView [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + ", tel=" + tel + "]";
}
}
PS:
1.如何将视图映射到Entity中,这里用的是@Subselect
这个注解,value
的值是视图的名称,如果需要添加一些特殊的条件,可以搜索一下这个注解的使用。
2.@Id
注解必须添加,否则报未指定标识符的异常。
5.代码调用
service层和dao层的就不展现了,直接展示调用的地方:
@Autowired
@Qualifier("testViewService")
private TestViewService testViewService;
@Action(value = "testView")
public void testView() throws Exception {
// 查询条件
Map<String, String> sortMap = new HashMap<String, String>();
// 条件排序
Map<String, Object> condMap = new HashMap<String, Object>();
// 查询结果
List<TestView> list = testViewService.findByList(condMap, sortMap);
for(TestView view : list) {
System.out.println(view);
}
}
6.结果展示
说明:目前我这边只对结果进行查看,并未做其他处理,所以用起来还是挺方便的。