Ok, I've got two entities from a legacy codebase involved in this query, and I'm not sure how to combine them. I'm also using Spring Data JPA with QueryDSL. Entities first:
Code:@Entity public class Foo { @Id Long id; String name; // other attributes... }Note that Foo has no knowledge of its Bars, and Bar has a many-to-one relationship to Foo, but manifested as an attribute holding the id of the Foo (not a @ManyToOne Foo foo -- remember, this is a legacy codebase).Code:@Entity public class Bar { @Id Long id; Long fooId; // NOTE: the Foo id, **not** the entity String status; // other attributes... }
Now, I want to find all Foos with a given name where there exists at least one Bar with a given id and a status that is not "DELETED" and whose fooId is equal to the corresponding Foo's id. How would I formulate that query using QueryDSL?
Code:// method impl inside custom SD JPA QueryDslPredicateExecutor<Foo> repository public List<Foo> findByNameWithNotDeletedBarAndBarFooId(String name, long barId) { QFoo foo = QFoo.foo; // generated by QueryDSL APT QBar bar = QBar.bar; // generated by QueryDSL APT Predicate p = new BooleanBuilder() .and(name != null && (name = name.trim()).length() > 0 ? foo.name.eq(name) : null) .and(bar.id.eq(barId)) .and(bar.status.ne("DELETED")); // how can you include condition "where bar.fooId equals foo.id" & combine with Predicate p? return findAll(???); }


Reply With Quote