I'm not sure I understand the different approaches being compared here. Are you opposing 1 and supporting 2?

  1. HatsService with methods .get_hats(), .throw_hats()  
  2. wearable_hats = db.query(Hats).map(hat => WearableHatDto(hat)
     throwable_hats = db.query(Hats).map(hat => ThrowableHatDto(hat)

(2)-ish patterns are more what I have in mind, but note that as soon as you're expecting the same `db.query(hats)` to give you the data you need for both (1) and (2), you might already be pretty far down the wrong road.