From d33e0729bbcb7624df476c3de0c426e4af468781 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Wed, 14 Sep 2011 10:00:32 +0300 Subject: [PATCH] #849734 : improved any() path initialization --- .../com/mysema/query/domain/AnyUsageTest.java | 63 +++++++++++++++++++ .../query/types/path/CollectionPathBase.java | 29 +++++++-- 2 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 querydsl-apt/src/test/java/com/mysema/query/domain/AnyUsageTest.java diff --git a/querydsl-apt/src/test/java/com/mysema/query/domain/AnyUsageTest.java b/querydsl-apt/src/test/java/com/mysema/query/domain/AnyUsageTest.java new file mode 100644 index 000000000..df8f0afc5 --- /dev/null +++ b/querydsl-apt/src/test/java/com/mysema/query/domain/AnyUsageTest.java @@ -0,0 +1,63 @@ +package com.mysema.query.domain; + +import static org.junit.Assert.assertNotNull; + +import java.io.Serializable; +import java.util.Set; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; + +import org.junit.Test; + +public class AnyUsageTest { + + @Entity + public class DealerGroup implements Serializable { + private static final long serialVersionUID = 8001287260658920066L; + + @Id + @GeneratedValue + public Long id; + + @OneToMany(mappedBy = "dealerGroup") + public Set dealers; + + } + + @Entity + public class Dealer implements Serializable { + private static final long serialVersionUID = -6832045219902674887L; + + @Id + @GeneratedValue + public Long id; + + @ManyToOne + public DealerGroup dealerGroup; + + @ManyToOne + public Company company; + + } + + @Entity + public class Company { + + @Id + @GeneratedValue + public Long id; + + } + + @Test + public void test() { + QAnyUsageTest_Dealer dealer = QAnyUsageTest_DealerGroup.dealerGroup.dealers.any(); + assertNotNull(dealer); + assertNotNull(dealer.company); + } + +} diff --git a/querydsl-core/src/main/java/com/mysema/query/types/path/CollectionPathBase.java b/querydsl-core/src/main/java/com/mysema/query/types/path/CollectionPathBase.java index fc7b612ec..f942547c7 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/path/CollectionPathBase.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/path/CollectionPathBase.java @@ -32,6 +32,8 @@ public abstract class CollectionPathBase, E, Q extends S @Nullable private transient volatile Constructor constructor; + private volatile boolean usePathInits = false; + public abstract Q any(); @SuppressWarnings("unchecked") @@ -39,15 +41,34 @@ public abstract class CollectionPathBase, E, Q extends S try{ if (constructor == null) { if (Constants.isTyped(queryType)){ - constructor = queryType.getConstructor(Class.class, PathMetadata.class); + try { + constructor = queryType.getConstructor(Class.class, PathMetadata.class, PathInits.class); + usePathInits = true; + } catch (NoSuchMethodException e) { + constructor = queryType.getConstructor(Class.class, PathMetadata.class); + } }else{ - constructor = queryType.getConstructor(PathMetadata.class); + try { + constructor = queryType.getConstructor(PathMetadata.class, PathInits.class); + usePathInits = true; + } catch (NoSuchMethodException e) { + constructor = queryType.getConstructor(PathMetadata.class); + } } } if (Constants.isTyped(queryType)){ - return (Q)constructor.newInstance(getElementType(), pm); + if (usePathInits) { + return (Q)constructor.newInstance(getElementType(), pm, PathInits.DIRECT); + } else { + return (Q)constructor.newInstance(getElementType(), pm); + } + }else{ - return (Q)constructor.newInstance(pm); + if (usePathInits) { + return (Q)constructor.newInstance(pm, PathInits.DIRECT); + } else { + return (Q)constructor.newInstance(pm); + } } } catch (NoSuchMethodException e) { throw new ExpressionException(e);