【问题标题】:How to convert oracle to JOOQ?如何将 oracle 转换为 JOOQ?
【发布时间】:2016-04-11 09:48:11
【问题描述】:

我们正面临将 Oracle Query 转换为 JOOQ Object 的问题。

Oracle 查询在这里:

select v0 AddressLine1, v1 AddressLine2, v2 AddrCity, v3 AddrProvince, v4 AddrPostal, v5 NameFirst, v6 NameMiddle,
  v7 AddrStreet, v8 NameLast, v9 Phone1, v10 PeopleCode, v11 LicenceNumber, v12 FamilyRSN, v13 PeopleRSN, v14 EmailAddress,
  v15 AddrHouse, v16 StatusCode, v17 ParentRSN, v18 StatusType, v19 FullName 
  from (select x.v0, x.v1, x.v2, x.v3, x.v4, x.v5, x.v6, x.v7, x.v8, x.v9, x.v10, x.v11, x.v12, x.v13, x.v14, x.v15, x.v16, 
  x.v17, x.v18, x.v19, rownum rn from (select amanda7.People.AddressLine1 v0, amanda7.People.AddressLine2 v1, 
  amanda7.People.AddrCity v2, amanda7.People.AddrProvince v3, amanda7.People.AddrPostal v4, amanda7.People.NameFirst v5, 
  amanda7.People.NameMiddle v6, amanda7.People.AddrStreet v7, amanda7.People.NameLast v8, amanda7.People.Phone1 v9, 
  amanda7.People.PeopleCode v10, amanda7.People.LicenceNumber v11, amanda7.People.FamilyRSN v12, amanda7.People.PeopleRSN v13,
  amanda7.People.EmailAddress v14, amanda7.People.AddrHouse v15, amanda7.People.StatusCode v16, amanda7.People.ParentRSN v17,
  amanda7.People.StatusType v18, (nvl(amanda7.People.OrganizationName, '') || nvl(amanda7.People.NameTitle, '') 
  || nvl(amanda7.People.NameFirst, '') || nvl(amanda7.People.NameMiddle, '') || nvl(amanda7.People.NameLast, '') ||
  nvl(amanda7.People.NameSuffix, '')) v19 from amanda7.People order by v19 desc) x where rownum <= (0 + 200))  where rn > 0;

JOOQ 在这里:

private SelectQuery<Record> getPeopleListQuery(Collection<SQLCondition<?>> conditions) {

        List<Field<?>> fields = new ArrayList<>();
        fields.add(People.PEOPLE.ADDRESS_LINE_1);
        fields.add(People.PEOPLE.ADDRESS_LINE_2);
        fields.add(People.PEOPLE.ADDR_CITY);
        fields.add(People.PEOPLE.ADDR_PROVINCE);
        fields.add(People.PEOPLE.ADDR_POSTAL);
        fields.add(People.PEOPLE.NAME_FIRST);
        fields.add(People.PEOPLE.NAME_MIDDLE);
        fields.add(People.PEOPLE.ADDR_STREET);
        fields.add(People.PEOPLE.NAME_LAST);
        fields.add(People.PEOPLE.PHONE_1);
        fields.add(People.PEOPLE.PEOPLE_CODE);
        fields.add(People.PEOPLE.LICENCE_NUMBER);
        fields.add(People.PEOPLE.FAMILY_RSN);
        fields.add(People.PEOPLE.PEOPLE_RSN);
        fields.add(People.PEOPLE.EMAIL_ADDRESS);
        fields.add(People.PEOPLE.ADDR_HOUSE);
        fields.add(People.PEOPLE.STATUS_CODE);
        fields.add(People.PEOPLE.PARENT_RSN);
        fields.add(People.PEOPLE.STATUS_TYPE);
        // Added to provide sort functionality on peopleName on header sort.
        fields.add(DSL.concat(DSL.isnull(People.PEOPLE.ORGANIZATION_NAME, ""), DSL.isnull(People.PEOPLE.NAME_TITLE, ""),
                DSL.isnull(People.PEOPLE.NAME_FIRST, ""), DSL.isnull(People.PEOPLE.NAME_MIDDLE, ""), DSL.isnull(People.PEOPLE.NAME_LAST, ""),
                DSL.isnull(People.PEOPLE.NAME_SUFFIX, "")).as("FullName"));
        advanceSearchSelectQuery.addFields(fields);
        advanceSearchSelectQuery.addOrderBy(SortDialogViewModelNew.createJSONString(userSortingChoice));
        return advanceSearchSelectQuery.getSelectQuery();
    }

这个 JOOQ 查询给出了异常无效的列名,因为我们使用了使用别名为 FullName 的 order by 子句。这个查询对 SQL 工作正常,但在 Oracle DB 中它给出异常。在 Oracle DB 中生成的查询低于订单by 子句给出 v19 而不是 FullName

 select v0 AddressLine1, v1 AddressLine2, v2 AddrCity, v3 AddrProvince, v4 AddrPostal, v5 NameFirst, v6 NameMiddle,
  v7 AddrStreet, v8 NameLast, v9 Phone1, v10 PeopleCode, v11 LicenceNumber, v12 FamilyRSN, v13 PeopleRSN, v14 EmailAddress,
  v15 AddrHouse, v16 StatusCode, v17 ParentRSN, v18 StatusType, v19 FullName 
  from (select x.v0, x.v1, x.v2, x.v3, x.v4, x.v5, x.v6, x.v7, x.v8, x.v9, x.v10, x.v11, x.v12, x.v13, x.v14, x.v15, x.v16, 
  x.v17, x.v18, x.v19, rownum rn from (select amanda7.People.AddressLine1 v0, amanda7.People.AddressLine2 v1, 
  amanda7.People.AddrCity v2, amanda7.People.AddrProvince v3, amanda7.People.AddrPostal v4, amanda7.People.NameFirst v5, 
  amanda7.People.NameMiddle v6, amanda7.People.AddrStreet v7, amanda7.People.NameLast v8, amanda7.People.Phone1 v9, 
  amanda7.People.PeopleCode v10, amanda7.People.LicenceNumber v11, amanda7.People.FamilyRSN v12, amanda7.People.PeopleRSN v13,
  amanda7.People.EmailAddress v14, amanda7.People.AddrHouse v15, amanda7.People.StatusCode v16, amanda7.People.ParentRSN v17,
  amanda7.People.StatusType v18, (nvl(amanda7.People.OrganizationName, '') || nvl(amanda7.People.NameTitle, '') 
  || nvl(amanda7.People.NameFirst, '') || nvl(amanda7.People.NameMiddle, '') || nvl(amanda7.People.NameLast, '') ||
  nvl(amanda7.People.NameSuffix, '')) v19 from amanda7.People order by FullName desc) x where rownum <= (0 + 200))  where rn > 0;

谁能帮我解决这个问题。

谢谢 司坦苏

【问题讨论】:

标签: java sql oracle jooq


【解决方案1】:

您遇到的问题已在 jOOQ 3.5.0 中修复:https://github.com/jOOQ/jOOQ/issues/2080

这是一个具有回归风险的重大变化,这就是为什么该修复没有向后移植到 jOOQ 3.4.x 版本的原因。如果你升级你的 jOOQ 版本,你的查询应该运行得很好。

【讨论】:

  • 是否有任何替代方法来实现这一点?我们需要显示一个由多列组合而成的字段,并且还需要对该字段进行排序。在 sqlserver 中,上述方法工作正常,但在 oracle 中失败。
  • @Sitansu:一个简单的解决方法是按列索引而不是按列名排序。这有帮助吗?
猜你喜欢
  • 2021-11-23
  • 2013-08-26
  • 2016-05-15
  • 2014-11-17
  • 2021-11-05
  • 2019-01-11
  • 2015-03-25
  • 2021-12-26
  • 2017-01-17
相关资源
最近更新 更多