[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [eclipselink-users] loading collection problem
|
Hi Tom,
The DescriptorCustomizer is a workaround, right? So can we consider the
need for it a bug in EclipseLink? By adding this - we loose the ability
to switch persistency providers, which is a shame.
-J.
On Wed, 2008-04-23 at 20:18 +0200, Leon Derks wrote:
> Hi Tom,
>
> I used an DescriptorCustomizer on Gear and that worked!
> Thanks!
>
> Leon
>
> Tom Ware wrote:
> > Hi Leon,
> >
> > You will want to use a DescriptorCustomizer on Product.
> >
> > http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_%28ELUG%29#Using_EclipseLink_JPA_Extensions_for_Customization_and_Optimization
> >
> >
> > In your descriptor customizer you'll be given a callback that
> > includes a ClassDescriptor.
> >
> > http://wiki.eclipse.org/Configuring_a_Descriptor_%28ELUG%29#Configuring_a_Descriptor_Customizer_Class
> >
> >
> > You should call
> > classDescriptor.getInheritancePolicy().setAlwaysUseOuterJoinForClassType(true)
> >
> >
> > -Tom
> >
> > Leon Derks wrote:
> >> Hi Tom,
> >>
> >> Yes indeed, with the outer join syntax I get the correct result.
> >>
> >> What is the workaround for this?
> >>
> >> Leon
> >>
> >>
> >> Tom Ware wrote:
> >>> Hi Leon,
> >>>
> >>> If you run slightly changed SQL do you get the correct results.
> >>> (change t0.PRODUCT_TYPE = ? to use the outer join syntax -
> >>> t0.PRODUCT_TYPE (+) = 'Gear')
> >>>
> >>> If that change gives you better results, it likely points to a
> >>> result that I can give you a workaround for.
> >>>
> >>> The other thing you can try is to make your @JoinFetch on
> >>> IndustrialFamily to use an OuterJoin
> >>>
> >>> @JoinFetch(JoinFetchType.OUTER)
> >>>
> >>> -Tom
> >>>
> >>> Leon Derks wrote:
> >>>> Hi Tom,
> >>>>
> >>>> Named query: select l from Lamp l left join fetch l.gears where
> >>>> l.id = :lampId
> >>>>
> >>>> This is the SQL:
> >>>> SELECT t1.ID, t1.PRODUCT_TYPE, t1.CODE, t1.SHORT_CODE, t1.NAME,
> >>>> t1.family_id, t0.ID, t0.PRODUCT_TYPE, t0.CODE, t0.SHORT_CODE,
> >>>> t0.NAME, t0.family_id, t0.GEAR_TYPE, t2.ID, t2.CODE, t2.NAME,
> >>>> t2.PROD_CAT FROM PLI_LAMP_GEAR t3, PLI.PLI_INDUSTRIAL_FAMILIES t2,
> >>>> PLI.PLI_CATALOG_PRODUCTS t1, PLI.PLI_CATALOG_PRODUCTS t0 WHERE
> >>>> (((t1.ID = ?) AND (t1.PRODUCT_TYPE = ?)) AND ((((t3.lamp_id (+) =
> >>>> t1.ID) AND (t0.ID (+) = t3.gear_id)) AND (t0.PRODUCT_TYPE = ?)) AND
> >>>> (t2.ID = t1.family_id)))
> >>>> bind => [75159, Lamp, Gear]
> >>>>
> >>>> A Product has a @JoinFetch to an IndustrialFamily
> >>>>
> >>>> When I remove the "left join fetch l.gears" from the named query, a
> >>>> Lamp with its Family is returned
> >>>>
> >>>> Database: Oracle 10G XE
> >>>> jdbc brand version: 10.2.0.4/ojdbc14.jar
> >>>>
> >>>> Leon
> >>>>
> >>>> Tom Ware wrote:
> >>>>> Hi Leon,
> >>>>>
> >>>>> Can you post the generated SQL?
> >>>>>
> >>>>> Also, can you post your database and jdbc driver brand and version?
> >>>>>
> >>>>> Thanks,
> >>>>> Tom
> >>>>>
> >>>>> Leon Derks wrote:
> >>>>>> Hi Tom,
> >>>>>>
> >>>>>> When I run the SQL against my database it also doesn't return
> >>>>>> something. So that is correct.
> >>>>>>
> >>>>>> I think I have to change my named query, but don't know how.
> >>>>>>
> >>>>>> I want to load a Lamp object with its collection of gears. If it
> >>>>>> has no gears, then the collection has to be empty.
> >>>>>> The query I run now, return no Lamp at all.
> >>>>>>
> >>>>>> Leon
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>> Tom Ware wrote:
> >>>>>>> Hi Leon,
> >>>>>>>
> >>>>>>> What SQL is your query producing? If you run the SQL against
> >>>>>>> your database, does it return a result?
> >>>>>>>
> >>>>>>> To see the SQL, you can increase the logging level. I suggest
> >>>>>>> using the maximum logging level when debugging. To do that,
> >>>>>>> specify the persistence unit property in your persistence.xml
> >>>>>>>
> >>>>>>> <property name="eclipselink.logging.level" value="FINEST"/>
> >>>>>>>
> >>>>>>> -Tom
> >>>>>>>
> >>>>>>> Leon Derks wrote:
> >>>>>>>> Hello
> >>>>>>>>
> >>>>>>>> Thanks for the answer on my previous question. That works well!
> >>>>>>>>
> >>>>>>>> But now I have another problem.
> >>>>>>>> I want to load an object with a collection that may be empty.
> >>>>>>>>
> >>>>>>>> For example my Lamp object has a @ManyToMany relation with Gear.
> >>>>>>>>
> >>>>>>>> public class Lamp extends Product {
> >>>>>>>>
> >>>>>>>> @ManyToMany
> >>>>>>>> @JoinTable(name="PLI_LAMP_GEAR", joinColumns =
> >>>>>>>> @JoinColumn(name="lamp_id", referencedColumnName = "ID"),
> >>>>>>>> inverseJoinColumns = @JoinColumn(name="gear_id",
> >>>>>>>> referencedColumnName = "ID"))
> >>>>>>>> private List<Gear> gears = new ArrayList<Gear>()
> >>>>>>>>
> >>>>>>>> }
> >>>>>>>>
> >>>>>>>> public class Gear extends Product {
> >>>>>>>> }
> >>>>>>>>
> >>>>>>>> In my situation, the Lamp has no Gears, so the join table is
> >>>>>>>> empty for this lamp.
> >>>>>>>>
> >>>>>>>> But when I try to load the Lamp it returns nothing. I want it
> >>>>>>>> to return a Lamp (with name, description etc) and an empty
> >>>>>>>> collection of Gears.
> >>>>>>>>
> >>>>>>>> This is my named query: "select l from Lamp l left join fetch
> >>>>>>>> l.gears where l.id = :lampId"
> >>>>>>>>
> >>>>>>>> I tried several queries, but always get the message:
> >>>>>>>> "javax.persistence.NoResultException: getSingleResult() did not
> >>>>>>>> retrieve any entities."
> >>>>>>>>
> >>>>>>>> Am I doing something wrong?
> >>>>>>>>
> >>>>>>>> greetings,
> >>>>>>>> Leon
> >>>>>>>>
> >>>>>>>> _______________________________________________
> >>>>>>>> eclipselink-users mailing list
> >>>>>>>> eclipselink-users@xxxxxxxxxxx
> >>>>>>>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
> >>>>>>> _______________________________________________
> >>>>>>> eclipselink-users mailing list
> >>>>>>> eclipselink-users@xxxxxxxxxxx
> >>>>>>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
> >>>>>>>
> >>>>>>>
> >>>>>>
> >>>>>> _______________________________________________
> >>>>>> eclipselink-users mailing list
> >>>>>> eclipselink-users@xxxxxxxxxxx
> >>>>>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
> >>>>> _______________________________________________
> >>>>> eclipselink-users mailing list
> >>>>> eclipselink-users@xxxxxxxxxxx
> >>>>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
> >>>>>
> >>>>>
> >>>>
> >>>> _______________________________________________
> >>>> eclipselink-users mailing list
> >>>> eclipselink-users@xxxxxxxxxxx
> >>>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
> >>> _______________________________________________
> >>> eclipselink-users mailing list
> >>> eclipselink-users@xxxxxxxxxxx
> >>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
> >>>
> >>>
> >>
> >> _______________________________________________
> >> eclipselink-users mailing list
> >> eclipselink-users@xxxxxxxxxxx
> >> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
> > _______________________________________________
> > eclipselink-users mailing list
> > eclipselink-users@xxxxxxxxxxx
> > https://dev.eclipse.org/mailman/listinfo/eclipselink-users
> >
> >
>
> _______________________________________________
> eclipselink-users mailing list
> eclipselink-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>