User.java
package domain; import javax.persistence.Column; import javax.persistence.ConstraintMode; import javax.persistence.Entity; import javax.persistence.ForeignKey; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; import org.hibernate.annotations.Formula; import org.hibernate.annotations.NotFound; import org.hibernate.annotations.NotFoundAction; @Entity @Table(name="user") public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name="id") private Long id; @Column(name="username") private String usrename; @Column(name="address_id") private Long addressId; @Formula(value="(select count(1) from address)") private Integer addressCount; public Integer getAddressCount() { return addressCount; } public void setAddressCount(Integer addressCount) { this.addressCount = addressCount; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsrename() { return usrename; } public void setUsrename(String usrename) { this.usrename = usrename; } public Long getAddressId() { return addressId; } public void setAddressId(Long addressId) { this.addressId = addressId; } }
Address.java
package domain; import javax.persistence.Table; import javax.persistence.Transient; import org.hibernate.annotations.Formula; import org.hibernate.annotations.NotFound; import org.hibernate.annotations.NotFoundAction; import javax.persistence.Column; import javax.persistence.ConstraintMode; import javax.persistence.Entity; import javax.persistence.ForeignKey; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; @Entity @Table(name="address") public class Address { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name="id") private Long id; @Column(name="address_name") private String addressName; //@Formula("(select count(*) from user u where u.address_id = id) ") @Transient private Integer matchCount; @OneToOne(targetEntity=Temp.class) @JoinColumn(name = "id",referencedColumnName = "address_id",foreignKey =@ForeignKey(value=ConstraintMode.NO_CONSTRAINT),insertable=false,updatable=false) @NotFound(action=NotFoundAction.IGNORE) private Temp temp; public Temp getTemp() { return temp; } public void setTemp(Temp temp) { this.temp = temp; } public Integer getMatchCount() { return matchCount; } public void setMatchCount(Integer matchCount) { this.matchCount = matchCount; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getAddressName() { return addressName; } public void setAddressName(String addressName) { this.addressName = addressName; } }
Temp.java
package domain; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import org.hibernate.annotations.Subselect; @Entity(name="temp") @Subselect(value="select id as userid,count(1) as usercount from user group by id") public class Temp { @Id private Long userid; private Integer usercount; public Long getUserid() { return userid; } public void setUserid(Long userid) { this.userid = userid; } public Integer getUsercount() { return usercount; } public void setUsercount(Integer usercount) { this.usercount = usercount; } }
Main.java
package domain; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.annotations.FilterJoinTable; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.hibernate.sql.JoinType; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.orm.hibernate5.HibernateTemplate; public class Main { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); SessionFactory sf = (SessionFactory) ctx.getBean("sessionFactory"); HibernateTemplate t = (HibernateTemplate) ctx.getBean("hibernateTemplate"); DetachedCriteria criteria = DetachedCriteria.forClass(Address.class); criteria.createCriteria("temp", JoinType.LEFT_OUTER_JOIN); List<Address> a = (List<Address>) t.findByCriteria(criteria); System.out.println(a.get(0).getTemp().getUsercount()); } }