java - Hibernate 标准多选查询与连接

标签 java hibernate spring-data-jpa

下面是我的实体类,我使用条件生成器检索该实体,但我只需要获取 idtitletags

问题.java

@Entity
@Table(name = "QUESTION_TITLE")
public class Question {

   @Id
   @Column(name = "id")
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   @Column(name = "title")
   private String title;

   @OneToOne(mappedBy = "question", cascade = CascadeType.ALL)
   private Body body;

   @ManyToMany
   @JoinTable(name = "QUESTION_TAGS", joinColumns = @JoinColumn(name = "question_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "tag_id", referencedColumnName = "id"))
   private Collection<Tags> tags;

   @ManyToOne(targetEntity = Registration.class, fetch = FetchType.LAZY)
   @JoinColumn(nullable = false, name = "user_id", referencedColumnName = "id")
   private Registration registration;
}

下面是我要获取的代码。我不知道如何项目标签表。

javax.persistence.criteria.CriteriaQuery<Question> query = getCriteriaBuilder().createQuery(Question.class);
Root<Question> question = query.from(Question.class);
query.multiselect(question.get("id"), question.get("title"), question.get("tags"));
List<Question> questionList = entityManager.createQuery(query).getResultList();

最佳答案

您可以使用 tuple criteria query :

CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Tuple> criteria = builder.createTupleQuery();
Root<Question> root = criteria.from(Question.class);
Path<Long> qId = root.get("id");
Path<String> qTitle = root.get("title");
Join<Question, Tag> qTag = root.join("tags", JoinType.INNER);

criteria.multiselect(qId, qTitle, qTag);
List<Tuple> tuples = session.createQuery(criteria).getResultList();
for (Tuple tuple : tuples)
{
   Long id = tuple.get(qId);
   String title = tuple.get(qTitle);
   Tag tag = tuple.get(qTag);
}

Another alternative选择多个值就是选择一个将“包裹”多个值的对象。对于这种方法,您应该声明一个包装类:

public class QuestionTag
{
   private final Long id;
   private final String title;
   private final Tag tag;

   public QuestionTag(Long id, String title, Tag tag)
   {
      this.id = id;
      this.title = title;
      this.tag = tag;
   }

   public Long getId()
   {
      return id;
   }

   public String getTitle()
   {
      return title;
   }

   public Tag getTag()
   {
      return tag;
   }
}

然后在查询中使用它:

CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<QuestionTag> criteria = builder.createQuery(QuestionTag.class);
Root<Question> root = criteria.from(Question.class);
Path<Long> qId = root.get("id");
Path<String> qTitle = root.get("title");
Join<Question, Tag> qTag = root.join("tags", JoinType.INNER);
criteria.select(builder.construct(QuestionTag.class, qId, qTitle, qTag));

List<QuestionTag> wrappers = session.createQuery(criteria).getResultList();

关于java - Hibernate 标准多选查询与连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60356537/

相关文章:

java - 如何对具有多个地址的用户进行建模?

Spring MVC : how to get case-insensitive ordering from Pageable

java - KeyAdapter 在 java 中卡住了一秒钟

java - 可以在 Java 中强制执行包依赖层次结构吗?

java - Spark Streaming + kafka "JobGenerator"java.lang.NoSuchMethodError

java - grails域类多重循环引用问题

java - 可选接口(interface)问题

java - 查看hibernate二级缓存数据的UI工具

java - 如何使用 Spring Boot 从类中仅返回几种类型?

java - 如何使用 Spring 和 Hibernate 从基本的 DAO 更改为 Repository 接口(interface)?