jpa 非原生sql,用传统的子查询写法,启动会报错,需要我们定义一个子查询对象。关联查询时关联定义的子查询的对象
@Entity
@Getter
@Setter
@Table(name = "数据库表名")
@Subselect(" select 字段 from 表 where 1=1 and (objectTypeIdStrFilter.objectTypeIdStr = '' or objectTypeIdStrFilter.objectTypeIdStr is null or 数据库字段=objectTypeIdStrFilter.objectTypeIdStr ) " ) // 动态参数
@Synchronize( {"数据库表名"} ) //tables impacted
@EntityListeners(AuditingEntityListener.class) // 固定写法
@FilterDef(
name = "objectTypeIdStrFilter", // 自定义过滤器 名字随意
parameters = @ParamDef(name = "objectTypeIdStr", type = "string") // 需要传入参数的字段
)
public class B implements Serializable {
}
定义sql
String sql = "select *from A left join B "
Session session = entityManager.unwrap(Session.class); // 必要写法
// 必要写法
session.enableFilter("objectTypeIdStrFilter").setParameter("objectTypeIdStr", 入参).validate(); // objectTypeIdStrFilter 自定义的过滤器 objectTypeIdStr 参数
Query query = entityManager.createQuery(sql);
query.unwrap(QueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);