【问题标题】:Oracle12cDialect changes from Hibernate 5.3.3 to 5.3.4 breaking my codeOracle12cDialect 从 Hibernate 5.3.3 更改为 5.3.4 破坏了我的代码
【发布时间】: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


【解决方案1】:

为此我要做的工作是配置我自己的方言处理程序。

spring.jpa.properties.hibernate.dialect=

而MyOwnOracle12cDialect如下

public class MyOwnOracle12cDialectextends Oracle12cDialect {

    @Override
    public LimitHandler getLimitHandler() {
        return SQL2008StandardLimitHandler.INSTANCE;
    }
}

在此之后,额外的选择不会出现。如果有人有更好的解决方案,请告诉我,我现在可以对 oneToMany 属性进行排序。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-09-30
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 2022-01-08
  • 1970-01-01
相关资源
最近更新 更多