java – JPA Criteria加入OneToMany表where子句不起作用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – JPA Criteria加入OneToMany表where子句不起作用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4181字,纯文字阅读大概需要6分钟。
内容图文
![java – JPA Criteria加入OneToMany表where子句不起作用](/upload/InfoBanner/zyjiaocheng/796/ea9eae844f724f32927da520a50e825c.jpg)
我有两张桌子.
CREATE TABLE public.question
(
id SERIAL PRIMARY KEY
, day VARCHAR(2) NOT NULL
, month VARCHAR(2) NOT NULL
, year VARCHAR(4) NOT NULL
);
CREATE TABLE public.question_translation
(
id SERIAL PRIMARY KEY
, question_id INT REFERENCES public.question(id) NOT NULL
, question_text TEXT NOT NULL
, language VARCHAR(2) NOT NULL
);
现在我想创建检索问题的标准.像这样的SQL:
SELECT * FROM question q LEFT JOIN question_translation qt ON q.id = qt.question_id WHERE qt.language =’en’
在使用JPA Criterias的java中,它看起来像这样:
@Override
public Collection<Question> findByMonthYear(String month, String year, String locale) {
EntityManager em = sessionFactory.createEntityManager();
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Question> criteriaQuery = builder.createQuery(Question.class);
List<Predicate> predicates = new ArrayList<>();
Root<Question> questionRoot = criteriaQuery.from(Question.class);
ListJoin<Question, QuestionTranslation> questionTranslationJoinRoot = questionRoot.join(Question_.questionTranslation, JoinType.LEFT);
predicates.add(builder.equal(questionRoot.get(Question_.month), month));
predicates.add(builder.equal(questionRoot.get(Question_.year), year));
predicates.add(builder.equal(questionTranslationJoinRoot.get(QuestionTranslation_.language), locale));
criteriaQuery.select(questionRoot).where(predicates.toArray(new Predicate[]{}));
TypedQuery<Question> query = em.createQuery(criteriaQuery);
String queryString = query.unwrap(Query.class).getQueryString();
return query.getResultList();
}
我使用ListJoin,因为在metamodel Question_.class我得到了这一行:
public static volatile ListAttribute<Question, QuestionTranslation> questionTranslation;
但是这个给我带有List QuestionTranslation的Question类,其中有两个条目,其中语言字段等于en和de值.但我指定where子句只返回一个语言等于en值的条目.我的代码出了什么问题?
更新#1:
我有第二个案子.
还有一张桌子:
CREATE TABLE public.user_answer
(
uuid VARCHAR(36) PRIMARY KEY
, user_uuid VARCHAR(36) REFERENCES public.users(uuid) NOT NULL
, question_id INT REFERENCES public.question(id) NOT NULL
, answer TEXT NOT NULL
);
我想像这样制作SQL:
SELECT * FROM user_answer ua LEFT JOIN问题q关于ua.question_id = q.id LEFT JOIN question_translation qt ON q.id = qt.question_id WHERE qt.language =’en’AND ua.user_uuid =’00000000-user-0000-0000 -000000000001’AND q.month =’01’AND q.day = ’01’AND q.year =’2016′;
在使用JPA Criterias的java中,它看起来像这样:
@Override
public UserAnswer findByDayMonthYear(String day, String month, String year, User user, String locale) {
EntityManager em = sessionFactory.createEntityManager();
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<UserAnswer> criteriaQuery = builder.createQuery(UserAnswer.class);
List<Predicate> predicates = new ArrayList<>();
Root<UserAnswer> userAnswerRoot = criteriaQuery.from(UserAnswer.class);
Join<UserAnswer, Question> questionJoin = userAnswerRoot.join(UserAnswer_.question);
ListJoin<Question, QuestionTranslation> questionTranslatJoin = questionJoin.join(Question_.questionTranslation);
predicates.add(builder.equal(builder.treat(questionJoin, Question.class).get(Question_.day), day));
predicates.add(builder.equal(builder.treat(questionJoin, Question.class).get(Question_.month), month));
predicates.add(builder.equal(builder.treat(questionJoin, Question.class).get(Question_.year), year));
predicates.add(builder.equal(builder.treat(questionTranslatJoin, QuestionTranslation.class).get(QuestionTranslation_.language), locale));
predicates.add(builder.equal(userAnswerRoot.get(UserAnswer_.user), user));
criteriaQuery.select(userAnswerRoot).where(predicates.toArray(new Predicate[]{}));
TypedQuery<UserAnswer> query = em.createQuery(criteriaQuery);
String queryString = query.unwrap(Query.class).getQueryString();
return query.getSingleResult();
}
在这种情况下,问题列表包含两个QuestionTranlsation项目,其中包含语言en和de,但我只需要一个QuestionTranlsation条目,其中语言等于en.
在这种情况下我该怎么做?
解决方法:
这可以通过JPA 2.1功能JOIN ON实现
见How to do JOIN ON query using Criteria API
内容总结
以上是互联网集市为您收集整理的java – JPA Criteria加入OneToMany表where子句不起作用全部内容,希望文章能够帮你解决java – JPA Criteria加入OneToMany表where子句不起作用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。