【发布时间】:2021-09-01 18:11:50
【问题描述】:
以下是我的领域模型
@Entity
@Table(schema="XXX" ,name="YYY")
public class User{
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="USER_KEY" , referencedColumnName="USER_KEY")
private List<UserArea> area;
}
@Entity
public class UserArea{
@Id
@Column(name="USER_KEY")
private int userKey;
private String userAreaName;
}
在我的 DAO 中,我有以下代码
Pageable pageable = PageRequest.of(pageNumber, pageSize);
//building a criteria
CriteriaBuilder criteriabuilder = entitymanager.getCriteriaBuilder();
CriteriaQuery criteriaquery = criteriabuilder.createQuery();
Root<User> user = criteriaquery.from(User.class);
Join<User, UserFunctionalArea> functionalArea = user.join("area", JoinType.LEFT);
criteriaquery.select(user);
TypedQuery<User> createQuery = entitymanager.createQuery(criteriaquery);
List<User> content = createQuery.setFirstResult((int) pageable.getOffset()).setMaxResults(pageable.getPageSize()).getResultList();
在 5.3.3 Hibernate-code 中,我得到以下 SQL
select > from USER user0_ left outer join AREA functional1_ on user0_.USER_KEY=functional1_.USER_KEY 先获取?仅行
而在 Hibernate 5.3.4 中,我得到以下 SQL 选择 * 从 ( select > from USER user0_ left outer join AREA functional1_ on user0_.USER_KEY=functional1_.USER_KEY ) where rownum
进一步调试发现 Oracle12cDialect 已从 5.3.3 更改为 5.3.4 以具有不同的限制处理程序 (Oracle9i$)。 限制处理程序(SQL2008StandardLimitHandler)直到 5.3.3 才在外部添加额外的 select *,而所有其他处理程序都在添加额外的 select *。
@Override
public LimitHandler getLimitHandler() { // only in 5.3.3
return SQL2008StandardLimitHandler.INSTANCE;
}
这是extra select * from outer select的根本原因。
从 5.3.4 开始,我无法对 Area->userAreaName 进行排序,因为它抱怨它不是引发整个问题的外部查询的一部分。在 5.3.4 中,我有以下查询
select * from ( select distinct > from user user0_ left outer join area functional1_ on user0_.user_key=functional1_.user_key ) 按upper(functional2_.userAreaName) desc 排序,upper(user0_.last_nm_prfrd) asc )其中rownum
在 5.3.4 之前,我从未从外部 SQL 选择查询中获得额外的 select *。
有人遇到过这个问题吗?我们能做些什么来解决它?我们可以通过什么方式在属性文件中配置限制处理程序?
谢谢
【问题讨论】:
-
有人能指出我为什么没有得到任何好的回复吗?
标签: hibernate