Hibernate

hibernate 结果集映射

http://peijunlin2008.iteye.com/blog/1269266

Result -> Map

1
2
3
4
5
6
7
8
9
10
List<Map> phoneCallTotalDurations = entityManager.createQuery(
"select new map(" +
" p.number as phoneNumber , " +
" sum(c.duration) as totalDuration, " +
" avg(c.duration) as averageDuration " +
") " +
"from Call c " +
"join c.phone p " +
"group by p.number ", Map.class )
.getResultList();

需要注意的点:
like 的写法;(in的写法类似:key in (:scope))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import org.hibernate.SQLQuery;
import org.hibernate.transform.Transformers;

public List<xxxVo> listAllMembers(Long orderUsedTimeId, String keyword, Integer page, Integer count) {
String haskey = "select u.id, u.nickname, u.background, u.portrait, c.name as companyName, case when m.id is null then '0' else '1' end as isInvited from t_user u join t_company c on u.companyId=c.id left join t_meetinginvitationrecord m on u.id=m.beInvitedUserId and m.orderUsedTimeId=:orderUsedTimeId where u.nickname like :keyword";
List<Map> list = Member.entityManager()
.createNativeQuery(haskey)
.setParameter("keyword", "%" + keyword + "%")
.setParameter("orderUsedTimeId", orderUsedTimeId)
.setFirstResult((page - 1) * count)
.setMaxResults(count)
.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
List<xxxVo> result = new LinkedList<>();
list.forEach(item -> {
BigInteger id = (BigInteger) item.get("id");
String nickname = (String) item.get("nickname");
String background = (String) item.get("background");
String portrait = (String) item.get("portrait");
String companyName = (String) item.get("companyName");
Boolean isInvited = ((String) item.get("isInvited")).equals("0") ? false : true;
result.add(new xxxVo(id.longValue(), nickname, background, portrait, companyName, isInvited));
});
return result;
}

Result -> List<>

都不怎么好,非得选就推荐用它了。

1
2
3
4
5
List<Object[]> persons = entityManager.createQuery(
"select distinct pr, ph " +
"from Person pr, Phone ph " +
"where ph.person = pr and ph is not null", Object[].class)
.getResultList();

Result -> Stream<>

http://hibernate.org/

1
2
3
4
5
6
7
8
9
10
11
12
13
try ( Stream<Object[]> persons = session.createQuery(
"select p.name, p.nickName " +
"from Person p " +
"where p.name like :name" )
.setParameter( "name", "J%" )
.stream() ) {

persons
.map( row -> new PersonNames(
(String) row[0],
(String) row[1] ) )
.forEach( this::process );
}