Hi Ernico,
Thank you very much for the java classes. With these two java classes and
the TblFndmst.java/BaseEntity.java that I made up, I am able to generate the
sql that you reported having problems using the dynamic JPQL query:
select ctl from TblAmdctl ctl where ctl.fndCde = ?1
The push-down SQL are:
SELECT t0.AMDCTL_ID, t0.VRS_NBR, t0.AMDSEQ_CDE, t0.DPLORD_NBR, t0.FND_CDE,
t0.RSL_DTE FROM TblAmdctl t0 WHERE (t0.FND_CDE = ?) [params=(String) 7]
SELECT t0.AMDCTL_ID, t1.AMDDES_ID, t1.VRS_NBR, t1.AMD_DES, t1.AMDCTL_ID,
t1.EFC_DTE FROM TblAmdctl t0 INNER JOIN TblAmddes t1 ON t0.AMDCTL_ID =
t1.AMDCTL_ID WHERE (t0.FND_CDE = ?) ORDER BY t0.AMDCTL_ID ASC [params=(String)
7]
The find TblAmdctl by primary key operation generates very different sql
(the where clause in findBy should have primary key, ie. t0.AMDCTL_ID = ?).
Could you confirm that the error you reported is from findBy operation or
from the JPQL? If it is from the JPQL, can you post the code snippet? Many
thanks!
The following is what I do:
String qryString = "select ctl from TblAmdctl ctl where ctl.fndCde = ?1";
- The first round:
Query qry = em.createQuery(qryString);
qry.setParameter(1, "7");
List<TblAmdctl> list = qry.getResultList();
- The second round:
qry.setParameter(1, "8");
list = qry.getResultList();
-Fay
--- On Sun, 9/21/08, egoosen <[EMAIL PROTECTED]> wrote:
> From: egoosen <[EMAIL PROTECTED]>
> Subject: Re: OpenJPA 1.2.0 Bug on FetchType.EAGER
> To: [email protected]
> Date: Sunday, September 21, 2008, 11:38 PM
> Hi Fay,
>
> Here are the classes:
>
> public class TblAmdctl extends BaseEntity {
>
> // Mapped Fields
>
> @TableGenerator(name="tblAmdctlGenerator",schema="EBSTATUS",table="TBL_KEYGEN",pkColumnName="PRIMARY_KEY_COLUMN"
>
> ,valueColumnName="LAST_USED_ID",pkColumnValue="TBL_AMDCTL_ID",allocationSize=1)
> @Id
>
> @GeneratedValue(strategy=GenerationType.TABLE,generator="tblAmdctlGenerator")
> @Column(name = "AMDCTL_ID",nullable=false)
> private Integer amdctlId;
>
> @Version
> @Column(name = "VRS_NBR")
> private Integer vrsNbr;
>
> @Basic
> @Column(name = "AMDSEQ_CDE",nullable=true)
> private String amdseqCde;
>
> @Basic
> @Column(name = "DPLORD_NBR",nullable=true)
> private Integer dplordNbr;
>
> @Basic
> @Column(name = "FND_CDE",nullable=true)
> private String fndCde;
>
> @Basic
> @Column(name = "RSL_DTE",nullable=true)
> @Temporal (TemporalType.DATE)
> private Date rslDte;
>
>
> // Mapped Relationships
> @OneToMany(mappedBy="tblAmdctl",fetch =
> FetchType.EAGER,cascade = {
> CascadeType.PERSIST,CascadeType.MERGE})
> private Collection<TblAmddes> tblAmddess = new
> ArrayList<TblAmddes>();
> @ManyToOne(fetch = FetchType.LAZY,cascade = {
> CascadeType.PERSIST,CascadeType.MERGE })
> @JoinColumns([EMAIL PROTECTED](name =
> "FND_CDE",referencedColumnName="FND_CDE")})
>
> @ForeignKey
> private TblFndmst tblFndmst;
> public Integer getAmdctlId() {
> return getInteger(amdctlId);
> }
> public void setAmdctlId(Integer amdctlId) {
> this.amdctlId = amdctlId;
> }
> public Integer getVrsNbr() {
> return getInteger(vrsNbr);
> }
> public void setVrsNbr(Integer vrsNbr) {
> this.vrsNbr = vrsNbr;
> }
>
> public String getAmdseqCde() {
> return getString(amdseqCde);
> }
> public void setAmdseqCde(String amdseqCde) {
> this.amdseqCde = amdseqCde;
> }
>
> public Integer getDplordNbr() {
> return getInteger(dplordNbr);
> }
> public void setDplordNbr(Integer dplordNbr) {
> this.dplordNbr = dplordNbr;
> }
> public String getFndCde() {
> return fndCde;
> }
> public void setFndCde(String fndCde) {
> this.fndCde = fndCde;
> }
> public Date getRslDte() {
> return getDate(rslDte);
> }
> public void setRslDte(Date rslDte) {
> this.rslDte = rslDte;
> }
> public Collection<TblAmddes> getTblAmddess() {
> if (tblAmddess == null) {
> tblAmddess = new ArrayList<TblAmddes>();
> }
> return tblAmddess;
> }
> public void setTblAmddess(Collection<TblAmddes>
> tblAmddess) {
> this.tblAmddess = tblAmddess;
> }
> public void addTblAmddes(TblAmddes tblAmddes) {
> tblAmddes.setTblAmdctl(this);
> getTblAmddess().add(tblAmddes);
> }
> public void removeTblAmddes(TblAmddes tblAmddes) {
> tblAmddes.setTblAmdctl(null);
> getTblAmddess().remove(tblAmddes);
> }
> public void addAllTblAmddess(Collection<TblAmddes>
> tblAmddess){
> for (TblAmddes tblAmddes : tblAmddess) {
> if (!getTblAmddess().contains(tblAmddes)){
> addTblAmddes(tblAmddes);
> }
> }
> }
>
> public TblFndmst getTblFndmst() {
> return tblFndmst;
> }
>
> public void setTblFndmst(TblFndmst tblFndmst) {
> this.tblFndmst = tblFndmst;
> if(tblFndmst!=null&&tblFndmst.getFndCde()!=null){
> setFndCde(tblFndmst.getFndCde());
> }
> }
>
> protected void synchParentRelationships(){
> getAmdctlId();
>
> if (needsToSynch(getTblFndmst())) {
> setTblFndmst(getTblFndmst());
> }
> }
>
> protected void synchChildRelationships(){
> syncCollection(getTblAmddess());
> }
> protected boolean isPKGenerated(){
> return true;
> }
> }
>
> public class TblAmddes extends BaseEntity {
>
> // Mapped Fields
>
> @TableGenerator(name="tblAmddesGenerator",schema="EBSTATUS",table="TBL_KEYGEN",pkColumnName="PRIMARY_KEY_COLUMN"
>
> ,valueColumnName="LAST_USED_ID",pkColumnValue="TBL_AMDDES_ID",allocationSize=1)
> @Id
>
> @GeneratedValue(strategy=GenerationType.TABLE,generator="tblAmddesGenerator")
> @Column(name = "AMDDES_ID",nullable=false)
> private Integer amddesId;
>
> @Version
> @Column(name = "VRS_NBR")
> private Integer vrsNbr;
>
> @Basic
> @Column(name = "AMDCTL_ID",nullable=true)
> private Integer amdctlId;
>
> @Basic
> @Column(name = "AMD_DES",nullable=true)
> private String amdDes;
>
> @Basic
> @Column(name = "EFC_DTE",nullable=true)
> @Temporal (TemporalType.DATE)
> private Date efcDte;
>
>
> // Mapped Relationships
> @ManyToOne(fetch = FetchType.LAZY,cascade = {
> CascadeType.PERSIST,CascadeType.MERGE })
> @JoinColumns([EMAIL PROTECTED](name =
> "AMDCTL_ID",referencedColumnName="AMDCTL_ID")})
>
> @ForeignKey
> private TblAmdctl tblAmdctl;
> public Integer getAmddesId() {
> return getInteger(amddesId);
> }
> public void setAmddesId(Integer amddesId) {
> this.amddesId = amddesId;
> }
> public Integer getVrsNbr() {
> return getInteger(vrsNbr);
> }
> public void setVrsNbr(Integer vrsNbr) {
> this.vrsNbr = vrsNbr;
> }
>
> public Integer getAmdctlId() {
> return getInteger(amdctlId);
> }
> public void setAmdctlId(Integer amdctlId) {
> this.amdctlId = amdctlId;
> }
>
> public String getAmdDes() {
> return getString(amdDes);
> }
> public void setAmdDes(String amdDes) {
> this.amdDes = amdDes;
> }
>
> public Date getEfcDte() {
> return getDate(efcDte);
> }
> public void setEfcDte(Date efcDte) {
> this.efcDte = efcDte;
> }
> public TblAmdctl getTblAmdctl() {
> return tblAmdctl;
> }
> public void setTblAmdctl(TblAmdctl tblAmdctl) {
> this.tblAmdctl = tblAmdctl;
> if(tblAmdctl!=null&&tblAmdctl.getAmdctlId()!=null){
> setAmdctlId(tblAmdctl.getAmdctlId());
> }
> }
> protected void synchParentRelationships(){
> getAmddesId();
>
> if (needsToSynch(getTblAmdctl())) {
> setTblAmdctl(getTblAmdctl());
> }
> }
> protected void synchChildRelationships(){
> }
> protected boolean isPKGenerated(){
> return true;
> }
> }
>
>
> Fay Wang wrote:
> >
> > Enrico,
> >
> > I have two findBy operations in my test case using
> the same em, and it
> > works fine. According to your sql, you have FND_CDE in
> the where clause
> > (see below):
> >
> > SELECT t0.AMDCTL_ID, t0.VRS_NBR, t0.AMDSEQ_CDE,
> t0.DPLORD_NBR, t0.FND_CDE,
> > t0.RSL_DTE FROM EBSTATUS.TBL_AMDCTL t0 WHERE
> t0.FND_CDE = ?
> > [params=(String) 0001001]
> >
> > SELECT t0.AMDCTL_ID, t1.AMDDES_ID, t1.VRS_NBR,
> t1.AMD_DES, t1.AMDCTL_ID,
> > t1.EFC_DTE FROM EBSTATUS.TBL_AMDCTL t0 INNER JOIN
> EBSTATUS.TBL_AMDDES t1
> > ON t0.AMDCTL_ID = t1.AMDCTL_ID WHERE t0.FND_CDE = ?
> ORDER BY t0.AMDCTL_ID
> > ASC [params=(String) 0000001]
> >
> > Is FND_CDE the primary key? Do you call:
> > TblAmdctl ctl2 = em.find(TblAmdctl.class, 1);
> >
> > It would be greatly appreciated if you could provide
> more information on
> > the TblAmdctl.java and TblAmddes.java for us to debug
> the cache problem.
> > Thanks!
> >
> > -Fay
> >
>
> --
> View this message in context:
> http://n2.nabble.com/OpenJPA-1.2.0-Bug-on-FetchType.EAGER-tp1100274p1108904.html
> Sent from the OpenJPA Users mailing list archive at
> Nabble.com.