直接上代码咯
说明:
subselect(可选):它将一个不可变(immutable)并且只读的实体映射到一个数据库的子查询中。当你想用视图代替一张基本表的时候,这是有用的,但最好不要这样做。
若指明的持久化类实际上是一个接口,这也是完全可以接受的。之后你可以用元素 <subclass> 来指定该接口的实际实现类。你可以持久化任何 static(静态的)内部类。你应该使用标准的类名格式来指定类名,比如:Foo$Bar。
package cn.jbit.test2.bean;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.Subselect;
import org.hibernate.annotations.Synchronize;
@Entity
@Table(name = "test_summary")
@Subselect("SELECT i.name AS itemName, MAX(b.amount) AS amountMax, COUNT(*) AS itemCount "
+ "FROM test_item i "
+ "INNER JOIN test_bid b ON i.item_id = b.id "
+ "GROUP BY i.name")
@Synchronize( { "test_item", "test_bid" })
// tables impacted
public class Summary implements Serializable {
private static final long serialVersionUID = 3647575276389635849L;
@Id
@Column(name = "itemName")
private String itemName;
@Column(name = "amountMax")
private double amountMax;
@Column(name = "itemCount")
private Integer itemCount;
public Summary() {
super();
}
public Summary(String itemName, double amountMax, Integer itemCount) {
super();
this.itemName = itemName;
this.amountMax = amountMax;
this.itemCount = itemCount;
}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public double getAmountMax() {
return amountMax;
}
public void setAmountMax(double amountMax) {
this.amountMax = amountMax;
}
public Integer getItemCount() {
return itemCount;
}
public void setItemCount(Integer itemCount) {
this.itemCount = itemCount;
}
}
测试类:
package cn.jbit.test2.test;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import cn.jbit.ch04.util.HibernateUtil;
import cn.jbit.test2.bean.Summary;
public class SummaryTest {
@SuppressWarnings("unchecked")
public static void add() {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
String hql = "from Summary";
Query query = session.createQuery(hql);
List<Summary> list = query.list();
// System.out.println(list.size());
for (Summary summary : list) {
System.out.println(summary.getItemName() + "\t"
+ summary.getAmountMax() + "\t"
+ summary.getItemCount());
}
tx.commit();
} catch (HibernateException e) {
if (tx.isActive()) {
tx.rollback();
}
e.printStackTrace();
}
}
public static void main(String[] args) {
add();
}
}