给出这个查询:
"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.clerk 到selected 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/