That's because names of the persistent attributes are case sensitive. In this case name of the persistent attribute is companies:
private Companies companies; but query tries to use Companies:
Join<Services, Companies> c = s.join("Companies", JoinType.INNER); In join one should use companies as follows:
Join<Services, Companies> c = s.join("companies", JoinType.INNER);