java - 发现另一个 JPA 奇怪的案例(添加一个 selected 属性完全改变了查询的结果集)

标签 java mysql sql jpa eclipselink

给出这个查询:

"SELECT DISTINCT lc.id, lc.debtor.officialCompanyName, lc.liquidationPublicationDate, lc.regNumberLegalRepresentative, lc.regNumberLiquidatorCompany, lc.liquidationStatusType, "
                    + "lc.authority, lc.liquidationSupervisor, lc.liquidationFinalizationDate, lc.finalReportFilingDate "
                    + "FROM LiquidationCase lc "
                        + "WHERE lc.active = 1 AND (lc.clerk = :user "
                            + "OR :user MEMBER OF lc.endemicSite.company.managers "
                            + "OR :user MEMBER OF lc.endemicSite.managers) "
                            + "AND lc.endemicSite.id = :endemicSiteId ")"

如果我添加 lc.clerkselected attributes,像这样:

"SELECT DISTINCT lc.id, lc.debtor.officialCompanyName, lc.liquidationPublicationDate, lc.regNumberLegalRepresentative, lc.regNumberLiquidatorCompany, lc.liquidationStatusType, "
                    + "lc.authority, lc.clerk, lc.liquidationSupervisor, lc.liquidationFinalizationDate, lc.finalReportFilingDate "
                    + "FROM LiquidationCase lc "
                        + "WHERE lc.active = 1 AND (lc.clerk = :user "
                            + "OR :user MEMBER OF lc.endemicSite.company.managers "
                            + "OR :user MEMBER OF lc.endemicSite.managers) "
                            + "AND lc.endemicSite.id = :endemicSiteId "

那么 lc-s 的 clerk 值为 null 将不会被选中,但是我想获得这些 lc-s (liquidCases)。不知何故,生成的查询并不好。

知道如何解决这个问题吗(请不要提及从数据库中选择的后处理职员)?

非常感谢任何提示。

更多信息:

第一个生成的查询:

SELECT DISTINCT t0.id,
                t1.official_company_name,
                t0.liquidation_publication_date,
                t0.reg_number_legal_representative,
                t0.reg_number_liquidator_company,
                t0.liquidation_status_type,
                t2.id,
                t2.active,
                t2.created_on,
                t2.deactivated_on,
                t2.department_name,
                t2.last_modified_on,
                t2.mask_agreement,
                t2.mask_closing_order,
                t2.mask_closing_order_publication,
                t2.mask_company_register,
                t2.mask_designation,
                t2.mask_disclosure,
                t2.mask_injunction,
                t2.mask_interim_financial_report,
                t2.mask_legal_representative,
                t2.name,
                t2.note,
                t2.is_persisted,
                t2.primary_fax,
                t2.primary_phone,
                t2.authority_type_id,
                t2.created_by_id,
                t2.deactivated_by_id,
                t2.last_modified_by_id,
                t2.address_id,
                t2.mailing_address_id,
                t2.primary_authority_email_address_id,
                t3.id,
                t3.active,
                t3.created_on,
                t3.deactivated_on,
                t3.last_modified_on,
                t3.is_persisted,
                t3.created_by_id,
                t3.deactivated_by_id,
                t3.last_modified_by_id,
                t3.personal_data_id,
                t0.liquidation_finalization_date,
                t0.final_report_filing_date
FROM liquidator.liquidation_case t0
LEFT OUTER JOIN liquidator.authority t2 ON (t2.id = t0.authority_id)
LEFT OUTER JOIN liquidator.liquidation_supervisor t3 ON (t3.id = t0.liquidation_supervisor), liquidator.site_manager_user_site t9,
                                                                                             liquidator.user_company t8,
                                                                                             liquidator.user_entity t7,
                                                                                             liquidator.site t6,
                                                                                             liquidator.company t5,
                                                                                             liquidator.user_entity t4,
                                                                                             liquidator.debtor t1
WHERE ((((t0.active = ?)
         AND (((t0.clerk_id = ?)
               OR (? = t4.id))
              OR (? = t7.id)))
        AND (t0.endemic_site_id = ?))
       AND (((((t6.id = t0.endemic_site_id)
               AND (t5.id = t6.company_id))
              AND ((t8.company_id = t5.id)
                   AND (t4.id = t8.user_id)))
             AND ((t9.site_id = t6.id)
                  AND (t7.id = t9.user_id)))
            AND (t1.id = t0.debtor_id)))

第二个生成的查询:

SELECT DISTINCT t0.id,
                t1.official_company_name,
                t0.liquidation_publication_date,
                t0.reg_number_legal_representative,
                t0.reg_number_liquidator_company,
                t0.liquidation_status_type,
                t2.id,
                t2.active,
                t2.created_on,
                t2.deactivated_on,
                t2.department_name,
                t2.last_modified_on,
                t2.mask_agreement,
                t2.mask_closing_order,
                t2.mask_closing_order_publication,
                t2.mask_company_register,
                t2.mask_designation,
                t2.mask_disclosure,
                t2.mask_injunction,
                t2.mask_interim_financial_report,
                t2.mask_legal_representative,
                t2.name,
                t2.note,
                t2.is_persisted,
                t2.primary_fax,
                t2.primary_phone,
                t2.authority_type_id,
                t2.created_by_id,
                t2.deactivated_by_id,
                t2.last_modified_by_id,
                t2.address_id,
                t2.mailing_address_id,
                t2.primary_authority_email_address_id,
                t3.id,
                t3.active,
                t3.created_on,
                t3.deactivated_on,
                t3.end_of_session,
                t3.surname,
                t3.forename,
                t3.last_login,
                t3.last_logout,
                t3.last_modified_on,
                t3.locked_on,
                t3.note,
                t3.password,
                t3.is_persisted,
                t3.phone_number,
                t3.role,
                t3.transaction_code,
                t3.username,
                t3.created_by_id,
                t3.deactivated_by_id,
                t3.last_modified_by_id,
                t3.address_id,
                t3.user_email_address_id,
                t3.locked_by,
                t3.login_site,
                t4.id,
                t4.active,
                t4.created_on,
                t4.deactivated_on,
                t4.last_modified_on,
                t4.is_persisted,
                t4.created_by_id,
                t4.deactivated_by_id,
                t4.last_modified_by_id,
                t4.personal_data_id,
                t0.liquidation_finalization_date,
                t0.final_report_filing_date
FROM liquidator.liquidation_case t0
LEFT OUTER JOIN liquidator.authority t2 ON (t2.id = t0.authority_id)
LEFT OUTER JOIN liquidator.liquidation_supervisor t4 ON (t4.id = t0.liquidation_supervisor), liquidator.site_manager_user_site t10,
                                                                                             liquidator.user_company t9,
                                                                                             liquidator.user_entity t8,
                                                                                             liquidator.site t7,
                                                                                             liquidator.company t6,
                                                                                             liquidator.user_entity t5,
                                                                                             liquidator.user_entity t3,
                                                                                             liquidator.debtor t1
WHERE ((((t0.active = ?)
         AND (((t0.clerk_id = ?)
               OR (? = t5.id))
              OR (? = t8.id)))
        AND (t0.endemic_site_id = ?))
       AND ((((((t7.id = t0.endemic_site_id)
                AND (t6.id = t7.company_id))
               AND ((t9.company_id = t6.id)
                    AND (t5.id = t9.user_id)))
              AND ((t10.site_id = t7.id)
                   AND (t8.id = t10.user_id)))
             AND (t1.id = t0.debtor_id))
            AND (t3.id = t0.clerk_id)))

更新:

好的。所以好的查询应该是这样的:

我如何告诉 JPA 使用此查询,使用左连接而不是 where 条件??!?

SELECT  DISTINCT t0.id,
                t1.official_company_name,
                t0.liquidation_publication_date,
                t0.reg_number_legal_representative,
                t0.reg_number_liquidator_company,
                t0.liquidation_status_type,
                t2.id,
                t2.active,
                t2.created_on,
                t2.deactivated_on,
                t2.department_name,
                t2.last_modified_on,
                t2.mask_agreement,
                t2.mask_closing_order,
                t2.mask_closing_order_publication,
                t2.mask_company_register,
                t2.mask_designation,
                t2.mask_disclosure,
                t2.mask_injunction,
                t2.mask_interim_financial_report,
                t2.mask_legal_representative,
                t2.name,
                t2.note,
                t2.is_persisted,
                t2.primary_fax,
                t2.primary_phone,
                t2.authority_type_id,
                t2.created_by_id,
                t2.deactivated_by_id,
                t2.last_modified_by_id,
                t2.address_id,
                t2.mailing_address_id,
                t2.primary_authority_email_address_id,
                t3.id,
                t3.active,
                t3.created_on,
                t3.deactivated_on,
                t3.end_of_session,
                t3.surname,
                t3.forename,
                t3.last_login,
                t3.last_logout,
                t3.last_modified_on,
                t3.locked_on,
                t3.note,
                t3.password,
                t3.is_persisted,
                t3.phone_number,
                t3.role,
                t3.transaction_code,
                t3.username,
                t3.created_by_id,
                t3.deactivated_by_id,
                t3.last_modified_by_id,
                t3.address_id,
                t3.user_email_address_id,
                t3.locked_by,
                t3.login_site,
                t4.id,
                t4.active,
                t4.created_on,
                t4.deactivated_on,
                t4.last_modified_on,
                t4.is_persisted,
                t4.created_by_id,
                t4.deactivated_by_id,
                t4.last_modified_by_id,
                t4.personal_data_id,
                t0.liquidation_finalization_date,
                t0.final_report_filing_date
FROM liquidator.liquidation_case t0
LEFT OUTER JOIN liquidator.authority t2 ON (t2.id = t0.authority_id)
LEFT OUTER JOIN liquidator.liquidation_supervisor t4 ON (t4.id = t0.liquidation_supervisor) 
LEFT OUTER JOIN liquidator.user_entity t3 ON (t3.id = t0.clerk_id),                         liquidator.site_manager_user_site t10,
                                                                                             liquidator.user_company t9,
                                                                                             liquidator.user_entity t8,
                                                                                             liquidator.site t7,
                                                                                             liquidator.company t6,
                                                                                             liquidator.user_entity t5,
                                                                                             liquidator.debtor t1
WHERE ((((t0.active = ?)
         AND (((t0.clerk_id = ?)
               OR (? = t5.id))
              OR (? = t8.id)))
        AND (t0.endemic_site_id = ?))
       AND ((((((t7.id = t0.endemic_site_id)
                AND (t6.id = t7.company_id))
               AND ((t9.company_id = t6.id)
                    AND (t5.id = t9.user_id)))
              AND ((t10.site_id = t7.id)
                   AND (t8.id = t10.user_id)))
             AND (t1.id = t0.debtor_id))
            AND (true)));

最佳答案

Clerk 是一个关系映射,因此如果您希望查询包含 null,则需要告诉它对关系使用外连接:

Select clerk, ... From LiquidationCase lc left join lc.clerk clerk...

关于java - 发现另一个 JPA 奇怪的案例(添加一个 selected 属性完全改变了查询的结果集),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27024644/

相关文章:

MySQL 对 DELETE 语句的限制

MySQL 选择查询 - 用例何时或加入?

java - 我应该如何解决 "Program Crashing"问题?

java - 尝试传递 customAdapter 时出现空指针异常?

mysql - 第1548章

php - 登录页面在 codeigniter 中不起作用

mysql - select for update 是锁定整个表还是只锁定返回的行?

SQLite changes() 计算未更改的更新

java - 替换 SQL 字符串中的时间戳占位符

Java 性能运行时泛型