关键代码:

<!-- formula:派生属性,也就是子查询。里面的一对括号是必须的 -->
<property name="message" type="java.lang.String" 
    formula="(SELECT CONCAT(TITLE,':',CONTENT) FROM news n WHERE n.ID=ID)">
</property>


代码片段:

News.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-6-25 14:50:51 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
	<!-- 
		table:表名。
		dynamic-update:动态更新,默认为false。执行update时生成的sql只会更改需要改的字段,
			而不是全部字段一起更改
		dynamic-insert:动态插入,默认为false。当插入数据时生成的insert语句,只生成不为null的数据。
	 -->
	<class name="com.shuoeasy.test.News" table="NEWS" dynamic-update="true" dynamic-insert="true">
		<id name="id" type="int">
			<column name="ID" />
			<!-- 指定主键的生成方式,
				increment:先查询数据库中最大的id,然后+1写入数据库。(开发时可以这么用)。
				identity:使用数据库的自增方式,例如mysql/sqlserver。
				sequence:使用数据库的序列,例如oracle、db2。
				hilo:采用hign/low算法,这种算法不依赖数据库,可以满足各种数据库,
					会在数据库生成一个hibernate_unique_xxx表。
				native:根据数据库的情况来选择用identity/sequence/hilo。可以满足各种数据库
				 -->
			<generator class="native"></generator>
			<!-- oracle使用序列的写法 
			<generator class="sequence" >
				<param name="sequence">my_se</param>
			</generator>
			-->
		</id>
		
		<!-- 
		unique="true":唯一约束,好像mysql不起作用
		update="false":字段不允许修改
		index="new_index":这个字段加上索引,如果两个字段都有相同的名字就是联合索引
		length="1":字段长度
		scale="2":小数点位数,对double、float有效
		 -->
		<property name="title" type="java.lang.String" index="new_index" length="1" >
			<column name="TITLE" />
		</property>
		<property name="content" type="java.lang.String" index="new_index">
			<column name="CONTENT" />
		</property>
		
		<!-- formula:派生属性,也就是子查询。里面的一对括号是必须的 -->
		<property name="message" type="java.lang.String" 
			formula="(SELECT CONCAT(TITLE,':',CONTENT) FROM news n WHERE n.ID=ID)">
		</property>
	</class>
</hibernate-mapping>


News.java:

package com.shuoeasy.test;

public class News {
	private int id;
	private String title;
	private String content;
	
	// 派生属性演示
	private String message;
	
	public News(){}
	
	public News(String title, String content) {
		super();
		this.title = title;
		this.content = content;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	
	public void setContent(String content) {
		this.content = content;
	}

	public void setMessage(String message){
		this.message = message;
	}
	
	public String getMessage(){
		return this.message;
	}
	
	/* 派生属性在简单情况下可以这么用:return this.title + ":" + this.content;
	   复杂的就在News.hbm.xml配置
	public String getMessage(){
		return this.title + ":" + this.content;
	}
	*/

	@Override
	public String toString() {
		return "News [id=" + id + ", title=" + title + ", content=" + content + ", message=" + message + "]";
	}
	
}


你可能感兴趣的文章