I'm using EclipseLink 2.1.1 on GlassFish 3.0.1. I'm having a hard time converting a SQL query into JPQL. The SQL works as expected. I guess the thing I'm struggling with is that I'm using a JoinTable on one of my objects that is not represented by an entity.
Below you will find my Entities that are involved in the SQL and the working SQL that returns the correct values.
Any help you can provide me with is greatly appreciated. Thank you for your effort.
Organization Entity:
@Entity
@Table(name = "Organization")
public class Organization implements Serializable {
@Id
@Column(name = "OrganizationId", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "Name", nullable = false, length = 128)
private String name;
@Column(name = "Level", nullable = false)
private int level;
@Column(name = "Alias", nullable = false, length = 50)
private String alias;
@JoinTable(name = "OrganizationAncestry",
joinColumns = {
@JoinColumn(name = "Ancestor", referencedColumnName = "OrganizationId", nullable = false)
},
inverseJoinColumns = {
@JoinColumn(name = "Descendent", referencedColumnName = "OrganizationId", nullable = false)
})
@ManyToMany(fetch = FetchType.EAGER)
private Collection<Organization> descendents;
@ManyToMany(mappedBy = "descendents", fetch = FetchType.EAGER)
private Collection<Organization> ancestors;
DocumentType entity:
@Entity
@Table(name = "DocumentType")
public class DocumentType implements Serializable {
@Id
@Column(name = "DocumentTypeID", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "TypeName", nullable = false, length = 40)
private String name;
@Column(name = "Alias", nullable = false, length = 40)
private String alias;
@Column(name = "Description", length = 256)
private String description;
@Column(name = "IsActive", nullable = false)
private boolean active;
@JoinColumn(name = "OrganizationID", referencedColumnName = "OrganizationID")
@ManyToOne(fetch = FetchType.LAZY)
private Organization organization;
}
My SQL:
SELECT
t1.*
FROM
DocumentType AS t1
JOIN
OrganizationAncestry AS t2
ON
t1.OrganizationId = t2.Ancestor
JOIN
Organization AS t3
ON
t3.OrganizationId = t2.Descendent
LEFT OUTER JOIN (
OrganizationAncestry AS t4
JOIN
Organization AS t5
ON
t4.Descendent = t5.OrganizationId
JOIN
DocumentType AS t6
ON
t5.OrganizationId = t6.OrganizationId
)
ON
t2.Ancestor = t4.Ancestor
AND
t4.Ancestor <> t4.Descendent
AND
t1.Alias = t6.Alias
WHERE
t1.IsActive = 1
AND
t3.Alias = 'IWT'
AND
t6.Alias IS NULL
[Updated on: Fri, 22 October 2010 18:37]
Report message to a moderator