Native SQL查询(二)

2014-11-24 08:33:59 ? 作者: ? 浏览: 7
CATS c, CATS m WHERE c.MOTHER_ID = c.ID")
.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技术架构”

-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: