To see if your query is good or bad in terms of execution time and plan you would have to take the time it takes to execute and if the execution plan for the generated SQL is bad in any way.
I personally would write it like this:
Code:
from Parent parent join parent.children ch where ch.type = :chType group by parent having count(parent.children)=1
You don't need the part before "from" if you only want the main object (parent in this case)
If i'm not mistaken the property names (ch.Type, parent.Children) should be in lowercase but if it works that way too it's ok i guess.
Hope that helps, rating appreciated