我正在尝试使用基于行的限制(例如:setFirstResult(5)
和setMaxResults(10)
)在已连接到其他表的Hibernate Criteria查询上实现分页.
可以理解的是,数据随机被切断; 这里解释了原因.
作为解决方案,页面建议使用"第二个sql选择"而不是连接.
如何将现有条件查询(使用连接createAlias()
)转换为使用嵌套选择?
我想使用Hibernate的标准api来制定一个连接两个实体的特定查询.假设我有两个实体,Pet和Owner,拥有许多宠物,但关键是这种关联没有映射到Java注释或xml中.
使用hql,我可以通过在查询中指定连接来选择拥有名为'fido'的宠物的所有者(而不是将一组宠物添加到所有者类).
可以使用休眠标准完成相同的操作吗?如果是这样的话?
谢谢,J
是否有一种从Hibernate Criteria获取(待生成)sql的简单方法?
理想情况下,我会有类似的东西:
Criteria criteria = session.createCriteria(Operator.class);
... build up the criteria ...
... and then do something like ...
String sql = criteria.toSql()
(But this of course does not exist)
Run Code Online (Sandbox Code Playgroud)
这个想法是使用sql作为巨大的'MINUS'查询的一部分(我需要找到两个相同模式之间的差异 - 结构相同,而不是数据 - 而Hibernate不支持MINUS)
(顺便说一句,我知道我可以从日志文件中检查SQL)
我如何使用Hibernate Restrictions实现这一目标?
(((A='X') and (B in('X',Y))) or ((A='Y') and (B='Z')))
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个hibernate标准来获得以下内容:
Dokument.class映射到Role roleId
Role.class有一个ContactPerson contactId
Contact.class FirstName LastName
我想在Contact类中搜索First或LastName,并检索连接的Dokuments列表.
我尝试过这样的事情:
session.createCriteria(Dokument.class)
.setFetchMode("role",FetchMode.JOIN)
.setFetchMode("contact",FetchMode.JOIN)
.add(Restrictions.eq("LastName","Test")).list();
Run Code Online (Sandbox Code Playgroud)
我得到一个错误无法解决类"Dokument"的属性"LastName"
有人可以解释为什么连接搜索Dokument而不是所有连接表?在此先感谢您的帮助!
我一直在JPA 1.0(Hibernate驱动程序)中使用Hibernate Restrictions.定义了Restrictions.ilike("column","keyword", MatchMode.ANYWHERE)
哪些测试关键字是否匹配列的任何位置,并且它不区分大小写.
现在,我使用JPA 2.0和EclipseLink作为驱动程序,因此我必须使用"Restrictions"内置JPA 2.0.我发现CriteriaBuilder
和方法like
,我也发现了如何使它匹配任何地方(尽管它是令人讨厌和手动),但我仍然没有想出如何做它不区分大小写.
我目前有一个很好的解决方案:
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<User> query = builder.createQuery(User.class);
EntityType<User> type = em.getMetamodel().entity(User.class);
Root<User> root = query.from(User.class);
// Where
// important passage of code for question
query.where(builder.or(builder.like(root.get(type.getDeclaredSingularAttribute("username", String.class)), "%" + keyword + "%"),
builder.like(root.get(type.getDeclaredSingularAttribute("firstname", String.class)), "%" + keyword + "%"),
builder.like(root.get(type.getDeclaredSingularAttribute("lastname", String.class)), "%" + keyword + "%")
));
// Order By
query.orderBy(builder.asc(root.get("lastname")),
builder.asc(root.get("firstname")));
// Execute
return em.createQuery(query).
setMaxResults(PAGE_SIZE + 1).
setFirstResult((page - 1) * PAGE_SIZE).
getResultList();
Run Code Online (Sandbox Code Playgroud)
问题: …
考虑以下JPQL查询:
SELECT foo FROM Foo foo
INNER JOIN FETCH foo.bar bar
WHERE bar.baz = :baz
Run Code Online (Sandbox Code Playgroud)
我正在尝试将其转换为Critieria查询.这是我得到的:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Foo> cq = cb.createQuery(Foo.class);
Root<Foo> r = cq.from(Foo.class);
Fetch<Foo, Bar> fetch = r.fetch(Foo_.bar, JoinType.INNER);
Join<Foo, Bar> join = r.join(Foo_.bar, JoinType.INNER);
cq.where(cb.equal(join.get(Bar_.baz), value);
Run Code Online (Sandbox Code Playgroud)
这里显而易见的问题是我正在进行两次相同的连接,因为Fetch<Foo, Bar>
似乎没有方法来获取Path
.有没有办法避免必须加入两次?或者我是否必须坚持使用简单的查询这么好的旧JPQL?
我有类别列表.我需要排除2,3行的类别列表.我们可以通过使用Criteria和Restriction来实现休眠吗?
例如,我有两个实体:Employee和Address.在这些enitities中,Employee有一个外键AddressID引用Address上的ID列.在Java域对象中,Hibernate使用Address对象字段很好地包装了forgein键整数字段.但是现在,我如何使用某个AddressID查询Employee?
我试图创建一个表别名.这似乎有效,但它相当尴尬.
我也尝试过这样的事情:
criteria.add(restriction.eq("TheAddressObjectFieldName", 123);
Run Code Online (Sandbox Code Playgroud)
它工作一段时间但并不总是.我不确定这是正确的方法,但我希望它能一直这样.
那么在hibernate中查询外键列的正确方法是什么?
criteria ×10
hibernate ×8
java ×6
hql ×2
jpa-2.0 ×2
distinct ×1
eclipselink ×1
join ×1
jpa ×1
paging ×1
restriction ×1
restrictions ×1
sql ×1