2012-05-31 148 views
1

我有QueryDSL查询的问题。类:QueryDSL查询异常

@Entity 
@Table(name="project") 
@Cacheable(true) 
@Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
public class Project extends DomainObject implements Comparable<Project>, IconizedComponent, Commentable { 

    @ManyToMany(targetEntity=Student.class) 
    @JoinTable(name="project_student") 
    @Sort(type=SortType.NATURAL) //Required by hibernate 
     @QueryInit({"user"}) 
    private SortedSet<Student> projectParticipants = new TreeSet<Student>(); 

    private Project(){} 

    //attributes, get+set methods etc 

} 

@Entity 
@Cacheable(true) 
@Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) //Hibernate specific 
public class Student extends Role { 

    public Student(){} 

    //attributes, get+set methods etc 

} 

@Entity 
@DiscriminatorColumn(name = "rolename", discriminatorType = DiscriminatorType.STRING, length = 8) 
@Table(name="role", uniqueConstraints={@UniqueConstraint(columnNames={"user_id","rolename"}, name = "role_is_unique")}) 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
public abstract class Role extends LazyDeletableDomainObject implements Comparable<Role> { 

    @ManyToOne(optional=false) 
    protected User user; 

    public Role(){} 

    //attributes, get+set methods etc 
} 

@Entity 
@Table(name="user") 
@Cacheable(true) 
@Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) //Hibernate specific 
public class User extends LazyDeletableDomainObject implements Comparable<User>, IconizedComponent { 

    private String firstName; 
    private String lastName; 

    public User(){} 

    //attributes, get+set methods etc 

} 

查询:

private BooleanExpression authorsNameContains(String searchTerm){ 
     QUser user = new QUser("user"); 
     user.firstName.containsIgnoreCase(searchTerm).or(user.lastName.contains(searchTerm)); 
     QStudent student = new QStudent("student"); 
     student.user.eq(user); 
     return QProject.project.projectParticipants.contains(student); 

    //java.lang.IllegalArgumentException: Undeclared path 'student'. Add this path as a source to the query to be able to reference it. 
} 

我也试图与

@QueryInit("*.*") 

标注在项目设置projectParticipants但是,这给出了同样的异常。任何提示?

+1

你的实际查询是怎样的?我只看到谓词的工厂方法。 –

+1

你可以发布引发的异常,或者更好的堆栈跟踪吗?另外你的初始目标还不明确,如果你给我们一个你想要做什么的想法,人们可以提供可能的选择。 – siebz0r

回答

2

@TimoWestkämper @ siebZ0r

感谢您的关注。对不起,延迟回复和错误措辞的问题。其实我想做的是写一个有效的BooleanExpression。

与已经取得的注解组合,这是我是后:

private BooleanExpression authorsFirstNameContains(String searchTerm){ 
    return QProject.project.projectParticipants.any().user.firstName.containsIgnoreCase(searchTerm); 
} 

我得到这个权利与同事的帮助。