2015-05-12 3 views
0

Указанные классы сущностей:критерии Hibernate, выбирая из объекта А где someId в B

class A { String name ... } 
class B { @OneToOne A a = ... ; String gender; ... } 

Я могу создать критерии Hibernate и запросить его и все его ассоциации.

Однако B вообще не ссылается на A. Он заселен по-отдельности, и я хотел бы сохранить его как таковой.

Есть ли способ выполнить спящий режим критерий запрос на A и сказать, где это также находится в отношении B или где он находится в отношении B, а какое-то поле в B - это и что?

Вот некоторые нерабочим код псевдо:

criteria(A.class).add(
     Restrictions.eq("name", "something") 
).createAlias(
     B.class, "..." 
).add(
     Restrictions.eq("gender", "Female") 
); 

Примечание, я предпочел бы не иметь, чтобы создать коллекцию на А, содержащее B и используя addAll.

Я мог бы подумать над тем, чтобы добавить мертвую ссылку, имея в виду то, что никогда не предназначено для доступа или обновления, но необходимое для спящего режима, чтобы снять это. Это может быть что-то вроде того, что это поддерживается другой таблицей.

ответ

1

Вы можете использовать подзапрос, следующим образом:

// create a 'DetachedCriteria' query for all the items in 'B' 
DetachedCriteria dc = DetachedCriteria.forClass(B.class).setProjection(
    Projections.projectionList().add(Projections.property("propertyInB")) 
); 

// then: search for A.id by adding 'dc' as asubquery:   
session.createCriteria(A.class).add(
    Subqueries.propertiesIn(new String[]{"propertyInA"}, dc) 
).list(); 

Это примерно эквивалентно: «SELECT * FROM A А, где в a.id (SELECT ID FROM B).

Я надеюсь, что мой SQL действителен;).

См гибернации документацию: https://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/querycriteria.html

+0

Великого. Я собираюсь проверить это. Но знаете ли вы, что DetachedCriteria можно использовать повторно и потокобезопасно? Могу ли я определить статический окончательный вариант и использовать в другом месте в потоковой среде? Например, запрос, который вы здесь делаете? – momomo

+0

Извините, я понятия не имею – IntelliData

+0

С другой стороны, все, что делает DetachedCriteria, это хранение инструкций для выполнения запроса без фактического выполнения чего-либо; впоследствии, когда вы выполняете запрос в контексте сеанса, вызывая отложенные критерии, вы выполняете его, как обычные критерии. Поэтому было бы целесообразно сказать, что если критерий является потокобезопасным, то это отделимый критерий и наоборот. – IntelliData