表结果如下

CREATE TABLE `ent_lable` (
`idStr` char(32) NOT NULL,
`pk_1` char(6) NOT NULL,
`pk_2` char(32) NOT NULL,
PRIMARY KEY (`idStr`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

本身为一张多对多的中间表

业务如下

  要根据pk_1查询所有的pk_2,然后再根据所得的pk_2的值查询出相关连的pk_1

模型:

    import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; @Entity
@Table(name="ent_lable")
public class EntLable extends BaseModel{ private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator="paymentableGenerator")
@GenericGenerator(name="paymentableGenerator",strategy="uuid")
@Column(name="idStr")
private String idStr;
@Column(name="pk_1")
private String pk_1;
@Column(name="pk_2")
private String pk_2;
public void setIdStr(String idStr){
this.idStr=idStr;
}
public String getIdStr(){
return idStr;
}
public String getPk_1() {
return pk_1;
}
public void setPk_1(String pk_1) {
this.pk_1 = pk_1;
}
public String getPk_2() {
return pk_2;
}
public void setPk_2(String pk_2) {
this.pk_2 = pk_2;
} }

DetachedCriteria的处理逻辑

DetachedCriteria dc = DetachedCriteria.forClass(EntLable.class);
if(StringUtils.isBlank(pk_1)) return null;
dc.add(Restrictions.eq("pk_1", pk_1));
dc.setProjection(Projections.property("pk_2"));
DetachedCriteria dc1 = DetachedCriteria.forClass(EntLable.class);
dc1.add(Property.forName("pk_2").eq(dc));

另,父类

import org.springframework.util.StringUtils;

public abstract class BaseModel extends BaseObject implements Modelable {

    private static final long serialVersionUID = 1L;

    public int hashCode() {
String idStr = getIdStr();
return StringUtils.isEmpty(idStr)?super.hashCode():idStr.hashCode();
} public boolean equals(Object other) {
if (other == null) {
return false;
}
if (other == this) {
return true;
}
/*因为字节码增强的关系,getClass()不能用作判断的依据*/
if (getClass().getPackage() != other.getClass().getPackage()) {
return false;
}
if (hashCode() == other.hashCode()) {
return true;
}
return false;
}
}
import java.io.Serializable;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.apache.log4j.Logger; public class BaseObject implements Cloneable, Serializable {
private static final long serialVersionUID = 1L;
/**日志对象*/
protected final Logger log = Logger.getLogger(getClass());
/**覆盖toString方法,ToStringStyle取值为ToStringStyle.SHORT_PREFIX_STYLE
* ,调试的时候注意会自动取所有引用的值,会触发所有的延迟加载
* @return String
* @see org.apache.commons.lang.builder.ToStringBuilder#reflectionToString(Object, ToStringStyle)
*/
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
/**
* 提供默认的clone方法的实现,不支持深层复制
* @return Object
*/
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException ex) {
throw new IllegalArgumentException(ex.getMessage());
}
}
}
import java.io.Serializable;

public interface Modelable extends JSONNotAware,Serializable, Cloneable {
String getIdStr();
void setIdStr(String idStr);
}
/**
* 实现此接口的对象,都不会被ModelUtils中的model2JSON和modelList2JSONArray转换方法序列化
*/
public interface JSONNotAware { }

hibernate-DetachedCriteria实现关联表条件复查的更多相关文章

  1. hibernate DetachedCriteria实现多表关联查询createAlias的使用

    记录本例查询初衷: 有表: 表1,表2,表3 关系 1 many-to-one 2 2 many-to-one 3 结果:要通过表3中的条件反向查询表1中相关的数据 public Page<We ...

  2. update关联其他表批量更新数据-跨数据库-跨服务器Update时关联表条件更新

    1.有时在做项目时会有些期初数据更新,从老系统更新到新系统.如果用程序循环从老系统付给新系统. 2.有时在项目中需要同步程序,或者自动同步程序时会有大量数据更新就可能用到如下方法了. 3.为了做分析, ...

  3. Hibernate 多对多关联查询条件使用

    from Brand as b inner join fetch b.styles as s where s.styleId=?

  4. 将一个多表关联的条件查询中的多表通过 create select 转化成一张单表的sql、改为会话级别临时表 【我】

    将一个多表关联的条件查询中的多表通过 create   select  转化成一张单表的sql 将结果改为创建一个会话级别的临时表: -- 根据下面这两个sql CREATE TABLE revenu ...

  5. Hibernate DetachedCriteria实现

     前段时间在做模糊查询,并利用数据库分页,DAO用hibernate实现,刚开始的时候 根据业务层的数据,拼hql语句进行查询,且不说要进行一些if判断,单从结构上来说, 底层的数据访问层依赖于业务层 ...

  6. Hibernate中的多表查询及抓取策略

    1.Hibernate中的多表查询 1.1SQL中的多表查询 [交叉连接] select * from A,B; [内连接] 显示内连接:inner join(inner 可以省略) Select * ...

  7. (转)Hibernate中的多表操作

    http://blog.csdn.net/yerenyuan_pku/article/details/70556208 Hibernate中的多表操作 在实际开发中,我们不可能只是简简单单地去操作单表 ...

  8. hibernate多对多关联映射

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  9. EF如何操作内存中的数据以及加载相关联表的数据:延迟加载、贪婪加载、显示加载

    之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需要用的,这个系列讲讲如何使用EF操作数据库.老版本的EF主要是通过Ob ...

随机推荐

  1. u3d_shader_surface_shader_6

    主题:1.膨胀效果:2.surface shader实际生成的代码: o(︶︿︶)o  粘贴复制代码易,理解透彻代码难... 一:膨胀效果 1.在#pragma 编译指令里添加vertex:vert以 ...

  2. uboot 移植遇到的问题及解决方法(转)

    http://blog.sina.com.cn/s/blog_988ec60801017iy3.html 一  在commond  env_nand.c: In function 'saveenv': ...

  3. 一个简单的socket程序运行与抓包查看

    为了熟悉socket编程,在ubuntu下运行了一个现有例子(Networking and Socket programming tutorial in C - CodeProject),并通过抓包查 ...

  4. html5游戏-追踪算法

    追踪算法的原理:目标位置 - 当前位置 / 速度,即: dx = targetX - currentX / speed, dy = targetY - currentY / speed var get ...

  5. k-d tree 学习笔记

    以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac ...

  6. c语言:printf系列的函数

    /** *----------------------------stdio.h--------------------------------------- * int printf(const c ...

  7. C语言:枚举类型

    整数常量的符号名称... #include <stdio.h> enum _bool {false,true}; int main(){ enum colors { red, orange ...

  8. JavaScript Date对象 日期获取函数

    JavaScript Date对象使用小例子: 运行结果: 总结: 1.尽管我们认为12月是第12个月份,但是JavaScript从0开始计算月份,所以月份11表示12月: 2.nowDate.set ...

  9. 布局 - layout

    示例 <div id="cc" class="easyui-layout" style="width:600px;height:400px;&q ...

  10. requirejs:性能优化-及早并行加载

    为了提高页面的性能,通常情况下,我们希望资源尽可能地早地并行加载.这里有两个要点,首先是尽早,其次是并行. 通过data-main方式加载要尽可能地避免,因为它让requirejs.业务代码不必要地串 ...