robert trudel
robert trudel

Reputation: 5749

Query to join with null element

I use spring data jpa with hibernate.

@Entity
public class Samples {

    @EmbeddedId
    private SampleId id;

    @MapsId("samplingId")
    @ManyToOne(optional = false)
    private Samplings sampling;
    ..
}

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Samplings {
    @OneToOne
    private Products product;

    @OneToOne
    private Dimensions dimension;

    @OneToOne
    private Colors color;
    ...
}

Dimension and colors could be null.

I search to get samples with product, dimensions, colors (if don't have dimension, colors, want to get samples too).

I did :

Join<Samples, Samplings> samplings = root.join("sampling", JoinType.INNER);
Join<Samples, Colors> colors = (Join) samplings.join("color", JoinType.INNER);
Join<Samples, Dimensions> dimension = (Join) samplings.join("dimension", JoinType.INNER);
Join<Samplings, Products> product = (Join) samplings.join("product", JoinType.INNER);

To get result I need I should put Left for color and dimension?

Upvotes: 0

Views: 42

Answers (1)

GMB
GMB

Reputation: 222402

if don't have dimension, colors, want to get samples too

To achieve that, you would need to change the INNER JOINs on color and dimension to LEFT JOINs :

Join<Samples, Samplings> samplings = root.join("sampling", JoinType.INNER);
Join<Samples, Colors> colors = (Join) samplings.join("color", JoinType.LEFT);
Join<Samples, Dimensions> dimension = (Join) samplings.join("dimension", JoinType.LEFT);
Join<Samplings, Products> product = (Join) samplings.join("product", JoinType.INNER);

Depending on your use case, you might want to turn the INNER JOIN on product to a LEFT JOIN as well.

Upvotes: 1

Related Questions