<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head> 
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0"> 
        <base href="https://hibernate.atlassian.net"> 
        <title>Message Title</title> 
    </head> 
    <body class="jira" style="color: #333333; font-family: Arial, sans-serif; font-size: 14px; line-height: 1.429"> 
        <table id="background-table" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0; mso-table-rspace: 0; background-color: #f5f5f5; border-collapse: collapse; mso-table-lspace: 0; mso-table-rspace: 0" bgcolor="#f5f5f5"> 
            <!-- header here --> 
            <tbody>
                <tr> 
                    <td id="header-pattern-container" style="padding: 0; border-collapse: collapse; padding: 10px 20px"> 
                        <table id="header-pattern" cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0; mso-table-rspace: 0"> 
                            <tbody>
                                <tr> 
                                    <td id="header-avatar-image-container" valign="top" style="padding: 0; border-collapse: collapse; vertical-align: top; width: 32px; padding-right: 8px" width="32"> <img id="header-avatar-image" class="image_fix" src="https://avatar-cdn.atlassian.com/04846d31c74497ef6069686a54ed682f?s=48&amp;d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2F04846d31c74497ef6069686a54ed682f%3Fd%3Dmm%26s%3D48%26noRedirect%3Dtrue" height="32" width="32" border="0" style="border-radius: 3px; vertical-align: top"> </td> 
                                    <td id="header-text-container" valign="middle" style="padding: 0; border-collapse: collapse; vertical-align: middle; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px"> <a class="user-hover" rel="janwillem.meyling" id="email_janwillem.meyling" href="https://hibernate.atlassian.net/secure/ViewProfile.jspa?name=janwillem.meyling" style="color:#6c797f;; color: #3b73af; text-decoration: none">Jan-Willem Gmelig Meyling</a> <strong>commented</strong> on <a href="https://hibernate.atlassian.net/browse/HHH-12895" style="color: #3b73af; text-decoration: none"><img src="cid:jira-generated-image-avatar-2d68709f-e0bb-452f-8bb2-0855be0cd956" height="16" width="16" border="0" align="absmiddle" alt="Bug"> HHH-12895</a> </td> 
                                </tr> 
                            </tbody>
                        </table> </td> 
                </tr> 
                <tr> 
                    <td id="email-content-container" style="padding: 0; border-collapse: collapse; padding: 0 20px"> 
                        <table id="email-content-table" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0; mso-table-rspace: 0; border-spacing: 0; border-collapse: separate"> 
                            <tbody>
                                <tr> 
                                    <!-- there needs to be content in the cell for it to render in some clients --> 
                                    <td class="email-content-rounded-top mobile-expand" style="padding: 0; border-collapse: collapse; color: #ffffff; padding: 0 15px 0 16px; height: 15px; background-color: #ffffff; border-left: 1px solid #cccccc; border-top: 1px solid #cccccc; border-right: 1px solid #cccccc; border-bottom: 0; border-top-right-radius: 5px; border-top-left-radius: 5px; height: 10px; line-height: 10px; padding: 0 15px 0 16px; mso-line-height-rule: exactly" height="10" bgcolor="#ffffff">&nbsp;</td> 
                                </tr> 
                                <tr> 
                                    <td class="email-content-main mobile-expand " style="padding: 0; border-collapse: collapse; border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #ffffff" bgcolor="#ffffff"> 
                                        <table class="page-title-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0; mso-table-rspace: 0"> 
                                            <tbody>
                                                <tr> 
                                                    <td style="vertical-align: top;; padding: 0; border-collapse: collapse; padding-right: 5px; font-size: 20px; line-height: 30px; mso-line-height-rule: exactly" class="page-title-pattern-header-container"> <span class="page-title-pattern-header" style="font-family: Arial, sans-serif; padding: 0; font-size: 20px; line-height: 30px; mso-text-raise: 2px; mso-line-height-rule: exactly; vertical-align: middle"> <a href="https://hibernate.atlassian.net/browse/HHH-12895" style="color: #3b73af; text-decoration: none">Re: Extra LEFT JOIN generated with @ManyToOne and @JoinTable when projecting on main entity id</a> </span> </td> 
                                                </tr> 
                                            </tbody>
                                        </table> </td> 
                                </tr> 
                                <tr> 
                                    <td id="text-paragraph-pattern-top" class="email-content-main mobile-expand  comment-top-pattern" style="padding: 0; border-collapse: collapse; border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #ffffff; border-bottom: none; padding-bottom: 0" bgcolor="#ffffff"> 
                                        <table class="text-paragraph-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0; mso-table-rspace: 0; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 2px"> 
                                            <tbody>
                                                <tr> 
                                                    <td class="text-paragraph-pattern-container mobile-resize-text " style="padding: 0; border-collapse: collapse; padding: 0 0 10px"> <p style="margin: 10px 0 0; margin-top: 0">Christian and I had a brief chat about this issue. Christian remembered that secondary tables etc. are always joined, I remembered observering something different for my queries, in particular with joined inheritance. So I adjusted his test case to use joined inheritance and added a subclass to the hierarchy so it wouldn't fallback to using single table inheritance anyway. And as a matter of fact: the test then passes. When using the JoinedSubclassPersister, the join is not generated. Which lead to the question why this happened, and whether this "optimisation" could be ported to the SingleTableEntityPersister too.</p> <p style="margin: 10px 0 0">The primary difference turned out to be in the implementation of the isClassOrSuperclassTable methods in the two entity persisters. For the SingleTableEntityPersister this method returns true for the JoinTable of the association, yet for the JoinedSubclassEntityPersister it returns false. This is caused by how the value for isClassOrSuperclassTable is set in the constructor.</p> <p style="margin: 10px 0 0">For the SingleTableEntityPersister we find:</p> 
                                                        <div class="code panel" style="border-width: 1px;; border: 1px solid #cccccc; background: #f5f5f5; font-size: 12px; line-height: 1.333; font-family: monospace; border: 1px solid #cccccc; -moz-border-radius: 3px; border-radius: 3px; margin: 9px 0">
                                                            <div class="codeContent panelContent" style="padding: 9px 12px"> 
                                                                <pre class="code-java" style="margin: 10px 0 0; margin-top: 0; max-height: 30em; overflow: auto; white-space: pre-wrap; word-wrap: normal">
                joinIter = persistentClass.getSubclassJoinClosureIterator();
                <span class="code-keyword" style="color: #000091">while</span> ( joinIter.hasNext() ) {
                        Join join = (Join) joinIter.next();
                        isConcretes.add( persistentClass.isClassOrSuperclassJoin( join ) );
</pre> 
                                                            </div>
                                                        </div> <p style="margin: 10px 0 0">For the JoinedSubclassEntityPersister we find:</p> 
                                                        <div class="code panel" style="border-width: 1px;; border: 1px solid #cccccc; background: #f5f5f5; font-size: 12px; line-height: 1.333; font-family: monospace; border: 1px solid #cccccc; -moz-border-radius: 3px; border-radius: 3px; margin: 9px 0">
                                                            <div class="codeContent panelContent" style="padding: 9px 12px"> 
                                                                <pre class="code-java" style="margin: 10px 0 0; margin-top: 0; max-height: 30em; overflow: auto; white-space: pre-wrap; word-wrap: normal">
                joinItr = persistentClass.getSubclassJoinClosureIterator();
                <span class="code-keyword" style="color: #000091">while</span> ( joinItr.hasNext() ) {
                        <span class="code-keyword" style="color: #000091">final</span> Join join = (Join) joinItr.next();
                        <span class="code-keyword" style="color: #000091">final</span> Table joinTable = join.getTable();

                        isConcretes.add( persistentClass.isClassOrSuperclassTable( joinTable ) );
</pre> 
                                                            </div>
                                                        </div> <p style="margin: 10px 0 0">This value is then used in AbstractEntityPersister's determineSubclassTableJoinType, where it then creates a join for the SingleTableEntityPersister and omits a join for the JoinedSubclassEntityPersister.</p> <p style="margin: 10px 0 0">In general I have the following findings:</p> 
                                                        <ul> 
                                                            <li>The implementation of isClassOrSuperclassTable is correct for the JoinedSubclassEntityPersister, but not for the SingleTableEntityPersister (from a naming perspective)</li> 
                                                            <li>(Most) uses of isClassOrSuperclassTable should however probably be replaced with a currently non-existent isClassOrSuperclassJoin (from a functional perspective), as all properties from the concrete and its supertypes are currently expected to be present in the tables in the from clause created by EntityPersister#fromJoinFragment</li> 
                                                            <li>While isClassOrSuperclassTable is false for isClassOrSuperclassJoin properties in the Join JoinedSubclassEntityPersister, this is usually not a problem, because getSubclassPropertyDeclarer will return Declarer.SUBCLASS for this property, eventually causing the subtables (including the joined tables) to be joined in the join fragment anyway.</li> 
                                                            <li>Although it is perfectly valid for the JoinedSubclassEntityPersister to not join the subclass tables (there is no need to), I find it very peculiar that it doesn't join the JoinTable by default and that we haven't seen issues with this.</li> 
                                                            <li>Indeed applying the same approach for isClassOrSuperclassJoin from the JoinedSubclassEntityPErsister to the SingleTableEntityPersister (making isClassOrSuperclassTable return false instead, effectively marking the property as a subclass property which is then only joined only when any "subclass" property or the entire entity is selected) , the test suite then fails with a couple of test failures (referencing a non present column from ommitting the join)</li> 
                                                            <li>This makes me worry whether these failing tests are actually valid scenarios for joined inheritance as well (which in that case would be broken rather than "optimized").</li> 
                                                            <li>I don't deem it possible to filter the joined tables in this from clause based on the projected columns, and thus properly fix/optimize this, for at least 5.x. I have no idea what the situation would be in 6.0.</li> 
                                                        </ul> <p style="margin: 10px 0 0">Would love to hear some feedback on my findings. Maybe I am overlooking something . My work in progress can be found at: <a href="https://github.com/JWGmeligMeyling/hibernate-orm/commit/78b02ec25c8d7f80d945040300b6fdbdfa40389b" class="external-link" rel="nofollow" style="color: #3b73af; text-decoration: none">https://github.com/JWGmeligMeyling/hibernate-orm/commit/78b02ec25c8d7f80d945040300b6fdbdfa40389b</a></p> </td> 
                                                </tr> 
                                            </tbody>
                                        </table> </td> 
                                </tr> 
                                <tr> 
                                    <td class="email-content-main mobile-expand " style="padding: 0; border-collapse: collapse; border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #ffffff" bgcolor="#ffffff"> <script type="application/ld+json">
{
  "@context": "http://schema.org",
  "@type": "EmailMessage",
  "description": "View Issue",
  "potentialAction": {
    "@type": "ViewAction",
        "target": "https://hibernate.atlassian.net/browse/HHH-12895?inbox=true&focusedCommentId=103419&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-103419",
    "name": "View Comment"
      },
  "publisher": {
    "@type": "Organization",
    "name": "Atlassian",
    "url": "https://www.atlassian.com"
  }
}
</script> 
                                        <table id="actions-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0; mso-table-rspace: 0; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px"> 
                                            <tbody>
                                                <tr> 
                                                    <td id="actions-pattern-container" valign="middle" style="padding: 0; border-collapse: collapse; padding: 10px 0 10px 24px; vertical-align: middle; padding-left: 0"> 
                                                        <table align="left" style="border-collapse: collapse; mso-table-lspace: 0; mso-table-rspace: 0"> 
                                                            <tbody>
                                                                <tr> 
                                                                    <td class="actions-pattern-action-icon-container" style="padding: 0; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 0; vertical-align: middle"> <a href="https://hibernate.atlassian.net/browse/HHH-12895#add-comment" target="_blank" title="Add Comment" style="color: #3b73af; text-decoration: none"> <img class="actions-pattern-action-icon-image" src="cid:jira-generated-image-static-comment-icon-781129a4-63c8-4b7b-aa2d-9711b37be509" alt="Add Comment" title="Add Comment" height="16" width="16" border="0" style="vertical-align: middle"> </a> </td> 
                                                                    <td class="actions-pattern-action-text-container" style="padding: 0; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 4px; padding-left: 5px"> <a href="https://hibernate.atlassian.net/browse/HHH-12895#add-comment" target="_blank" title="Add Comment" style="color: #3b73af; text-decoration: none">Add Comment</a> </td> 
                                                                </tr> 
                                                            </tbody>
                                                        </table> </td> 
                                                </tr> 
                                            </tbody>
                                        </table> </td> 
                                </tr> 
                                <!-- there needs to be content in the cell for it to render in some clients --> 
                                <tr> 
                                    <td class="email-content-rounded-bottom mobile-expand" style="padding: 0; border-collapse: collapse; color: #ffffff; padding: 0 15px 0 16px; height: 5px; line-height: 5px; background-color: #ffffff; border-top: 0; border-left: 1px solid #cccccc; border-bottom: 1px solid #cccccc; border-right: 1px solid #cccccc; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; mso-line-height-rule: exactly" height="5" bgcolor="#ffffff">&nbsp;</td> 
                                </tr> 
                            </tbody>
                        </table> </td> 
                </tr> 
                <tr> 
                    <td id="footer-pattern" style="padding: 0; border-collapse: collapse; padding: 12px 20px"> 
                        <table id="footer-pattern-container" cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0; mso-table-rspace: 0"> 
                            <tbody>
                                <tr> 
                                    <td id="footer-pattern-mobile-separated-links" class="mobile-resize-text" width="100%" colspan="2" style="padding: 0; border-collapse: collapse; color: #999999; font-size: 12px; line-height: 18px; font-family: Arial, sans-serif; mso-line-height-rule: exactly; mso-text-raise: 2px"> Get Jira notifications on your phone! Download the Jira Cloud app for <a href="https://play.google.com/store/apps/details?id=com.atlassian.android.jira.core&amp;referrer=utm_source%3DNotificationLink%26utm_medium%3DEmail" style="color: #3b73af; text-decoration: none">Android</a> or <a href="https://itunes.apple.com/app/apple-store/id1006972087?pt=696495&amp;ct=EmailNotificationLink&amp;mt=8" style="color: #3b73af; text-decoration: none">iOS</a> 
                                        <hr> </td> 
                                </tr> 
                                <tr> 
                                    <td id="footer-pattern-text" class="mobile-resize-text" width="100%" style="padding: 0; border-collapse: collapse; color: #999999; font-size: 12px; line-height: 18px; font-family: Arial, sans-serif; mso-line-height-rule: exactly; mso-text-raise: 2px"> This message was sent by Atlassian Jira <span id="footer-build-information">(v1001.0.0-SNAPSHOT#100090-<span title="c4535c9b1c1af5199f7416fb6c7f9b213369ecc0" data-commit-id="c4535c9b1c1af5199f7416fb6c7f9b213369ecc0}">sha1:c4535c9</span>)</span> </td> 
                                    <td id="footer-pattern-logo-desktop-container" valign="top" style="padding: 0; border-collapse: collapse; padding-left: 20px; vertical-align: top"> 
                                        <table style="border-collapse: collapse; mso-table-lspace: 0; mso-table-rspace: 0"> 
                                            <tbody>
                                                <tr> 
                                                    <td id="footer-pattern-logo-desktop-padding" style="padding: 0; border-collapse: collapse; padding-top: 3px; opacity: 0.150"> <img id="footer-pattern-logo-desktop" src="cid:jira-generated-image-static-footer-desktop-logo-284cf9fc-5265-41b8-9604-adb8ef946c4e" alt="Atlassian logo" title="Atlassian logo" width="192" height="24" class="image_fix"> </td> 
                                                </tr> 
                                            </tbody>
                                        </table> </td> 
                                </tr> 
                            </tbody>
                        </table> </td> 
                </tr> 
            </tbody>
        </table>   
    </body>
</html>