Java Hibernate条件带联接的多选查询
下面是我的实体类,我正在使用criteria builder检索此实体,但我只需要获取Java Hibernate条件带联接的多选查询,java,hibernate,spring-data-jpa,Java,Hibernate,Spring Data Jpa,下面是我的实体类,我正在使用criteria builder检索此实体,但我只需要获取id、title和标记 Question.java @实体 @表(name=“问题\标题”) 公开课问题{ @身份证 @列(name=“id”) @GeneratedValue(策略=GenerationType.IDENTITY) 私人长id; @列(name=“title”) 私有字符串标题; @OneTONE(mappedBy=“question”,cascade=CascadeType.ALL) 私人机
id
、title
和标记
Question.java
@实体
@表(name=“问题\标题”)
公开课问题{
@身份证
@列(name=“id”)
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@列(name=“title”)
私有字符串标题;
@OneTONE(mappedBy=“question”,cascade=CascadeType.ALL)
私人机构;
@许多
@JoinTable(name=“QUESTION\u TAGS”,joinColumns=@JoinColumn(name=“QUESTION\u id”,referencedColumnName=“id”),inverseJoinColumns=@JoinColumn(name=“tag\u id”,referencedColumnName=“id”))
私人收藏标签;
@manytone(targetEntity=Registration.class,fetch=FetchType.LAZY)
@JoinColumn(nullable=false,name=“user\u id”,referencedColumnName=“id”)
私人注册;
}
下面是我的代码获取。我不知道如何将项目标签表
javax.persistence.criteria.CriteriaQuery query=getCriteriaBuilder().createQuery(Question.class);
根问题=query.from(question.class);
query.multiselect(question.get(“id”)、question.get(“title”)、question.get(“标签”);
List questionList=entityManager.createQuery(query.getResultList();
如果只想获取问题实体的id、标题和标记,可以使用
请尝试以下代码:
CriteriaQuery<Tuple> query = getCriteriaBuilder().createTupleQuery();
Root<Question> question = query.from(Question.class);
query.multiselect(question.get("id"), question.get("title"), question.get("tags"));
List<Tuple> questionList = entityManager.createQuery(query).getResultList();
CriteriaQuery query=getCriteriaBuilder().createTupleQuery();
根问题=query.from(question.class);
query.multiselect(question.get(“id”)、question.get(“title”)、question.get(“标签”);
List questionList=entityManager.createQuery(query.getResultList();
您可以使用:
CriteriaBuilder=session.getCriteriaBuilder();
CriteriaQuery criteria=builder.createTupleQuery();
Root=criteria.from(Question.class);
路径qId=root.get(“id”);
路径qTitle=root.get(“title”);
Join qTag=root.Join(“标记”,JoinType.INNER);
标准:多选(qId、qTitle、qTag);
列表元组=session.createQuery(条件).getResultList();
for(元组:元组)
{
Long id=tuple.get(qId);
字符串标题=tuple.get(qTitle);
Tag=tuple.get(qTag);
}
要选择多个值,请选择将“包装”多个值的对象。对于这种方法,您应该声明一个包装类:
公共类问号
{
私人最终长id;
私人最终字符串标题;
私人最终标签;
公共问题标签(长id、字符串标题、标签)
{
this.id=id;
this.title=标题;
this.tag=tag;
}
公共长getId()
{
返回id;
}
公共字符串getTitle()
{
返回标题;
}
公共标记getTag()
{
返回标签;
}
}
然后在查询中使用它:
CriteriaBuilder=session.getCriteriaBuilder();
CriteriaQuery criteria=builder.createQuery(QuestionTag.class);
Root=criteria.from(Question.class);
路径qId=root.get(“id”);
路径qTitle=root.get(“title”);
Join qTag=root.Join(“标记”,JoinType.INNER);
选择(builder.construct(QuestionTag.class、qId、qTitle、qTag));
List wrappers=session.createQuery(条件).getResultList();
这是可行的,但为什么我不能在集合中获取实体中声明的标记@AashishVerma我无法通过文件中的引用来证明这一点,但恐怕您应该选择整个实体来实现它。您可以将所有关联声明为惰性关联,并仅获取必要的关联标记
。