1. 熟悉对象化查询方式,熟悉HQL
设计DAO层,实现以下DAO:
l 实现根据玩家名称查询指定玩家数据的DAO
public List<Player> findByName(Stringname) {
try {
List<Player> list = newArrayList<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 = newArrayList<Player>();
return list1;
}
}
l 实现统计的DAO:按升序的方式,统计显示玩家的宠物数量,结果包括:玩家ID,玩家名称,宠物数量
public List<Player> findPlayer(){
List<Player> list = newArrayList<Player>();
String hql = "select player from Player as player inner joinplayer.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 = newArrayList<Pet>();
String hql = "select pet from Player as player inner joinplayer.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. Selectplayer.id,player.name,count(pet.id) from Playeras player inner join player.pet as pet group byplayer.id order by count(pet.id)
4. Select pet from Player as player inner joinplayer. 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_petwhere player.id=player_pet.player_id group by player.id
3. select pet.id,pet.name,pet.grade,pet.exp from player,player_pet,petwhere 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 =newArrayList<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 =newArrayList<Pet>();
list.addAll(player.getPet());
assertEquals(list, test.findPet());
test.closeSession();
}
}