[odb-users] How to create an object view that has a self join

Boris Kolpackov boris at codesynthesis.com
Wed Oct 21 09:51:42 EDT 2015


Hi Steve,

Hales, Steve <Steve.Hales at garmin.com> writes:

> #pragma db object
> class person
> {
>   #pragma db id
>   unsigned long id_;
>   std::string name_;
>   #pragma db value_not_null inverse(person_)
>   std::vector<odb::lazy_weak_ptr<family_member>> family_members_;
> };
> 
> #pragma db object
> class family
> {
>   #pragma db id
>   unsigned long id_;
>   std::string name_;
>   #pragma db value_not_null inverse(family_)
>   std::vector<odb::lazy_weak_ptr<family_member>> family_members_;
> };
> 
> #pragma db object
> class family_member
> {
>   #pragma db id
>   unsigned long id_;
>   #pragma db not_null
>   odb::lazy_shared_ptr<person> person_;
>   #pragma db not_null
>   odb::lazy_shared_ptr<family> family_;
> };
> 
> Now, I need to create an object view that has a self join on the
> family_members table so that, given a person ID, I can get all persons
> that are members of the families for that person. Here is my failed
> attempt:
> 
> #pragma db view \
>     object(person) \
>     object(family_member) \
>     object(family_member = fm2 inner : family_member::family_)
> struct person_view
> {
>   std::shared_ptr<person> person_;
> };

How does it fail? Don't just say "it doesn't work", it is not helpful.
Be specific (error messages, query you get, etc).


> Here is the working SQL query for this self join:
> SELECT
>   'persons'.*
>     FROM
>   'persons'
>     INNER JOIN
>   'family_members'
>   ON 'family_members'.'person' = 'persons'.'id'
> INNER JOIN
>   'family_members' as fm2
>   ON 'family_members'.'family' = fm2.'family'
>     WHERE
>   fm2.'person_id¹ = ?

The last JOIN is not based on the object relationship, so you will need
to spell the condition explicitly:

object(family_member = fm2 inner: fm2::family_ == family_member::family_)

Also you may want to add 'inner' to the first family_member object that
you have in the view.

Boris



More information about the odb-users mailing list