.addEntity("cat", Cat.class)
.addEntity("mother", Cat.class)
这个查询指明:
SQL查询语句,其中包含占位附来让Hibernate注射字段别名
查询返回的实体
上面使用的{cat.*}和{mother.*}标记是作为“所有属性”的简写形式出现的。当然你也可以明确地罗列出字段名,但在这个例子里面我们让Hibernate来为每个属性注射SQL字段别名。字段别名的占位符是属性名加上表别名的前缀。在下面的例子中,我们从另外一个表(cat_log)中 通过映射元数据中的指定获取Cat和它的妈妈。注意,要是我们愿意,我们甚至可以在where子句中使用属性别名。
String sql = "SELECT ID as {c.id}, NAME as {c.name}, " +
"BIRTHDATE as {c.birthDate}, MOTHER_ID as {c.mother}, {mother.*} " +
"FROM CAT_LOG c, CAT_LOG m WHERE {c.mother} = c.ID";
List loggedCats = sess.createSQLQuery(sql)
.addEntity("cat", Cat.class)
.addEntity("mother", Cat.class).list()
16.1.4.1. 别名和属性引用(Alias and property references)
大多数情况下,都需要上面的属性注射,但在使用更加复杂的映射,比如复合属性、通过标识符构造继承树,以及集合类等等情况下,也有一些特别的别名,来允许Hibernate注射合适的别名。
下表列出了使用别名注射参数的不同可能性。注意:下面结果中的别名只是示例,实用时每个别名需要唯一并且不同的名字。
表 16.1. 别名注射(alias injection names)
|
|
|
|
|
|---|---|---|---|
| 简单属性 |
{[aliasname].[propertyname] |
A_NAME as {item.name} |
|
| 复合属性 |
{[aliasname].[componentname].[propertyname]} |
CURRENCY as {item.amount.currency}, VALUE as {item.amount.value} |
|
| 实体辨别器(Discriminator of an entity) |
{[aliasname].class} |
DISC as {item.class} |
|
| 实体的所有属性 |
{[aliasname].*} |
{item.*} |
|
| 集合键(collection key) |
{[aliasname].key} |
ORGID as {coll.key} |
|
| 集合id |
{[aliasname].id} |
EMPID as {coll.id} |
|
| 集合元素 |
{[aliasname].element} |
XID as {coll.element} |
|
| 集合元素的属性 |
{[aliasname].element.[propertyname]} |
NAME as {coll.element.name} |
|
| 集合元素的所有属性 |
{[aliasname].element.*} |
{coll.element.*} |
|
| 集合的所有属性 |
{[aliasname].*} |
{coll.*} |
|
16.1.5. 返回非受管实体(Returning non-managed entities)
可以对原生sql 查询使用ResultTransformer。这会返回不受Hibernate管理的实体。
sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
.setResultTransformer(Transformers.aliasToBean(CatDTO.class))
这个查询指定:
SQL查询字符串
结果转换器(result transformer)
上面的查询将会返回CatDTO的列表,它将被实例化并且将NAME和BIRTHDAY的值注射入对应的属性或者字段。
16.1.6. 处理继承(Handling inheritance)
原生SQL查询假若其查询结果实体是继承树中的一部分,它必须包含基类和所有子类的所有属性。
16.1.7. 参数(Parameters)
原生查询支持位置参数和命名参数:
Query query = sess.createSQLQuery("SELECT * FROM CATS WHERE NAME like ").addEntity(Cat.class);
List pusList = query.setString(0, "Pus%").list();
query = sess.createSQLQuery("SELECT * FROM CATS WHERE NAME like :name").addEntity(Cat.class);
List pusList = query.setString("name", "Pus%").list();
作者“ERDP技术架构”