1. 熟悉对象化查询方式,熟悉HQL
设计DAO层,实现以下DAO:
l 实现根据玩家名称查询指定玩家数据的DAO
public List<Player> findByName(String name) {
try {
List<Player> list = new ArrayList<Player>();
String hql = "from Player where name=?";
Query query = session.createQuery(hql);
query.setString(0, name);
// 把多个实体添加到list中
for (int i = 0; i < query.list().size(); i++) {
Player player = (Player) query.list().get(i);
list.add(player);
test = true;
System.out.println(player.getId() + " " + player.getName()
+ " " + player.getJob() + " " + player.getGrade()
+ " " + player.getExp());
}
return list;
} catch (Exception e) {
test = false;
System.out.println("查询操作未完成");
List<Player> list1 = new ArrayList<Player>();
return list1;
}
}
l 实现统计的DAO:按升序的方式,统计显示玩家的宠物数量,结果包括:玩家ID,玩家名称,宠物数量
public List<Player> findPlayer() {
List<Player> list = new ArrayList<Player>();
String hql = "select player from Player as player inner join player.pet as pet group by player.id order by count(pet.id)";
Query query = session.createQuery(hql);
for (int i = 0; i < query.list().size(); i++) {
Player player = (Player) query.list().get(i);
list.add(player);
test = true;
System.out.println(player.getId() + " " + player.getName()
+ " " + player.getPet().size());
}
return list;
}
l 显示宠物等级高于主人等级的宠物数据
public List<Pet> findPet() {
List<Pet> list = new ArrayList<Pet>();
String hql = "select pet from Player as player inner join player.pet as pet where pet.grade>player.grade";
Query query = session.createQuery(hql);
for (int i = 0; i < query.list().size(); i++) {
Pet pet = (Pet) query.list().get(i);
list.add(pet);
test = true;
System.out.println(pet.getId() + " " + pet.getName() + " "
+ pet.getExp() + " " + pet.getGrade());
}
return list;
}
l 分别使用Criteria、HQL、SQL,这三种方式来实现以上操作,并对比这种查询方式的区别
Criteria:
1. Criteria crit = session.createCriteria(Player.class);
crit. add( Restrictions.like("name", "%%") );
List players = crit.list();
2. Criteria crit = session.createCriteria(Player.class);
crit. addOrder( Order.asc("pet") );
List players = crit.list();
Hql:
1. String hql = "from Player where name=?";
Query query = session.createQuery(hql);
query.setString(0, name);
或者 hql = "from Player user where user.name='yyy' ";
3. Select player.id,player.name,count(pet.id) from Player as player inner join player.pet as pet group by player.id order by count(pet.id)
4. Select pet from Player as player inner join player. Pet as pet where pet.grade>player.grade
Sql:
1. select *from player where name=”test”
2. select player.id ,player.name,count(pet_id) from player,player_pet where player.id=player_pet.player_id group by player.id
3. select pet.id,pet.name,pet.grade,pet.exp from player,player_pet,pet where player.id=player_pet.player_id and player_pet.pet_id=pet.id and pet.grade>player.grade
l 要求先编写测试用例,测试DAO,实现测试驱动开发
package test.hibernate;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.List;
import hibernate.PlayerDaoHibernate;
import hibernate.model.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class PlayerDaoHibernateTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void testFindByName() {
PlayerDaoHibernate test = new PlayerDaoHibernate();
test.doConfiguration();
test.openSession();
Player player=test.createPlayer();
test.saveEntity(player);
List<Player> list =new ArrayList<Player>();
list.add(player);
assertEquals(list, test.findByName("test"));
test.closeSession();
}
@Test
public void testFindPet() {
PlayerDaoHibernate test = new PlayerDaoHibernate();
test.doConfiguration();
test.openSession();
Player player=test.createPlayer();
test.saveEntity(player);
List<Pet> list =new ArrayList<Pet>();
list.addAll(player.getPet());
assertEquals(list, test.findPet());
test.closeSession();
}
}