我有一个域对象 Expense,它有一个名为initialFields的字段。
它是这样注释的:
@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true)
@JoinTable(blah blah)
private final List<Field> initialFields;
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试使用 Projections 以便出于性能原因仅提取某些字段,但是这样做时 initialFields 字段始终为空。它是唯一的 OneToMany 字段,也是我试图用这种方式的投影检索的唯一字段。如果我使用常规 HQL 查询,initialFields 会适当填充,但当然我不能限制字段。
部分投影代码:
Criteria criteria = session.createCriteria(Payment.class);
criteria.createAlias("expense", "e");
ProjectionList properties = Projections.projectionList();
//Some restrictions and more fields
properties.add(Projections.property("e.initialFields"), "initialFields");
criteria.setProjection(properties);
criteria.setFetchMode("e.initialFields", FetchMode.JOIN);
criteria.setReadOnly(true);
criteria.setResultTransformer(Transformers.aliasToBean(Expense.class));
return criteria.list();
Run Code Online (Sandbox Code Playgroud)
当我打开调试并打开 show sql 时,似乎没有创建/运行拉取 initialFields 的查询。有没有人见过这样的事情?
我刚刚尝试使用 HQL 投影,通过指定我想要拉取的每个字段然后手动构建对象。在这种情况下,Hibernate 构建的 SQL 对于 initialFields 字段是不正确的。 expense1_.name as col_1_0_, . as col_2_0_, expense1_.account_id as col_3_0_ …
我使用的是Spring 3.1.1.RELEASE,Hibernate 4.1.0.Final,JUnit 4.8和JPA 2.0(hibernate-jpa-2.0-api).我正在尝试根据成员字段的字段编写查询和搜索.我的意思是我有这个实体......
@GenericGenerator(name = "uuid-strategy", strategy = "uuid.hex")
@Entity
@Table(name = "cb_organization", uniqueConstraints = {@UniqueConstraint(columnNames={"organization_id"})})
public class Organization implements Serializable
{
@Id
@NotNull
@GeneratedValue(generator = "uuid-strategy")
@Column(name = "id")
/* the database id of the Organization */
private String id;
@ManyToOne
@JoinColumn(name = "state_id", nullable = true, updatable = false)
/* the State for the organization */
private State state;
@ManyToOne
@JoinColumn(name = "country_id", nullable = false, updatable = false)
/* The country the Organization is in …Run Code Online (Sandbox Code Playgroud) 我有一个Entity Transaction如下:
@Entity
class Transaction extends AbstractEntity<Long>{
private static final long serialVersionUID = 7222139865127600245L;
//other attributes
@ElementCollection(fetch = FetchType.EAGER, targetClass = java.lang.String.class)
@CollectionTable(name = "transaction_properties", joinColumns = @JoinColumn(name = "p_id"))
@MapKeyColumn(name = "propertyKey")
@Column(name = "propertyValue")
private Map<String, String> properties;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
所以,我的数据库Table为transaction_properties是
mysql> desc transaction_properties;
+---------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| p_id | bigint(20) | NO | PRI | | | …Run Code Online (Sandbox Code Playgroud) 试图覆盖 Oracle10gDialect 并添加 over 和 partition 函数。我在hibernate.org 上阅读了有关如何覆盖方言的信息。我正在使用 Hibernate 4.1.7.Final 并且无法升级。我按照规定实现了它,但是我收到了这个错误。
15:21:21,353 WARN SqlExceptionHelper:143 - SQL Error: 907, SQLState: 42000
[10/8/13 15:21:21:354 CDT] 00000021 SystemOut O ORA-00907: missing right parenthesis
[10/8/13 15:21:21:354 CDT] 00000021 SystemOut O 15:21:21,354 ERROR SqlExceptionHelper:144 - ORA-00907: missing right parenthesis
Run Code Online (Sandbox Code Playgroud)
这是我构建的类:
package com.edmann.util;
import org.apache.log4j.Logger;
import org.hibernate.dialect.Oracle10gDialect;
import org.hibernate.dialect.function.StandardSQLFunction;
/**
* Because i need some analytic functions i am going to extend the
* oracle10gDialect so i can register my functions i want to …Run Code Online (Sandbox Code Playgroud) java hibernate analytic-functions oracle10g hibernate-criteria
尝试搜索关系的多个值时,会返回重复的结果。
我怎样才能避免这些重复?
我们的服务有一个方法来构建Criteria:
@Override
protected Criteria createCriteria(Map<String, Object> values) {
Criteria criteria = super.createCriteria(values);
if (criteria != null && values != null) {
// other criteria restrictions
Set<MDTErkenning> erkenningen = (Set<MDTErkenning>) values.get("erkenningen");
if (erkenningen != null && !erkenningen.isEmpty()) {
criteria.createAlias("erkenningen", "erkenningen");
criteria.add(Restrictions.in("erkenningen." + CollectionPropertyNames.COLLECTION_ELEMENTS, erkenningen));
}
}
return criteria;
}
Run Code Online (Sandbox Code Playgroud)
用于获取分页结果并进行计数:
@Override
public List<T> findByCriteria(Map<String, Object> values, int offset, int amount) {
Criteria criteria = createCriteria(values)
.setFirstResult(offset)
.setMaxResults(amount);
return criteria.list();
}
@Override
public Long getCount(Map<String, Object> values) { …Run Code Online (Sandbox Code Playgroud) 假设我有一些类,如下所示:
OpA extends Operation
OpA1 extends OpA
OpA2 extends OpA
OpB extends Operation
OpB1 extends OpB
OpB2 extends OpB
OpB3 extends OpB
OpC extends Operation
Operation
|
/-----------------------------\
/ | \
OpA OpB OpC
/ |
/ |
/------\ /-----------\
/ \ / | \
OpA1 OpA2 OpB1 OpB2 OpB3
Run Code Online (Sandbox Code Playgroud)
如果我想找一些操作,我可以这样做:
session.createCriteria(Operation.class)
.add(...)
.add(...)
.addOrder(...)
.setFirstResult(...)
.setMaxResults(...)
.list();
Run Code Online (Sandbox Code Playgroud)
但是,如果我想将这些标准不应用于所有类型的操作Operation.class,而只应用于类型的那些操作:OpA2+ OpB1+ OpB3+ OpC?
我的问题:我怎样才能使用Hibernate Criteria?请不要HQL.
注意:我不知道是否应该将此问题视为"查询多个类"(其中所有字段都具有与我查询的字段相同的字段),或者我将其视为"限制查询"通过子类列表".
编辑:如果我能创建一个接口TheOnesIWant,然后进行类OpA2,OpB1, …
考虑该类Operation及其3个子类:
class Operation {}
class OpA extends Operation { }
class OpB extends Operation { Account account; }
class OpC extends Operation { Account account; }
Run Code Online (Sandbox Code Playgroud)
只有OpB并OpC有一个字段叫account.
我想查询account属性:
session.createCriteria(Operation.class)
.add(Restrictions.eq("account", account))
.list();
Run Code Online (Sandbox Code Playgroud)
这有效.休眠忽略了一个事实,这两个Operation并OpA没有所谓的领域account,并返回正确的结果OpB和OpC.
但是,现在我还想查询帐户所有者,并按顺序排序.然后,我创建别名_account为account:
session.createCriteria(Operation.class)
.add(Restrictions.eq("account", account))
.createAlias("account", "_account")
.add(Restrictions.eq("_account.owner", "John"))
.addOrder(Order.asc("_account.owner"))
.list();
Run Code Online (Sandbox Code Playgroud)
这失败了.该帐户有两个单独的表(来自OpB和OpC),所以Hibernate抱怨:
Not unique table/alias: 'account1_'
Run Code Online (Sandbox Code Playgroud)
我的问题:如何Criteria …
例如,假设Customer实体具有一组订单.每个订单都有一组OrderItems.
我可以使用命名属性执行此操作:
EntityGraph<Customer> eg = em.createEntityGraph(Customer.class);
Subgraph<Order> egChild = eg.addSubgraph("orders");
egChild.addAttributeNodes("orderItems");
Run Code Online (Sandbox Code Playgroud)
如果我只对Orders感兴趣,我可以使用元模型执行此操作:
EntityGraph<Customer> eg = em.createEntityGraph(Customer.class);
eg.addSubgraph(Customer_.orders);
Run Code Online (Sandbox Code Playgroud)
但是,如果我只想使用元模型的整个图形,我不能这样做:
EntityGraph<Customer> eg = em.createEntityGraph(Customer.class);
Subgraph<Set<Order>> egChild = eg.addSubgraph(Customer_.orders);
egChild.addAttributeNodes(Order_.orderItems);
Run Code Online (Sandbox Code Playgroud)
问题似乎是这样的
eg.addSubgraph(Customer_.orders)
Run Code Online (Sandbox Code Playgroud)
返回一个
Subgraph<Set<Order>>
Run Code Online (Sandbox Code Playgroud)
而不是一个
Subgraph<Order>
Run Code Online (Sandbox Code Playgroud)
这是元模型/实体图的缺点,还是我遗漏了什么?
几分钟前收到错误“重复别名”,我开始思考“我们可以检查别名是否已经创建?别名已经存在。”
你知道吗?我们可以检查一下吗?
例如 :
Criteria criteria = getSeession().createCriteria(Example.class,"example");
criteria.createAlias("example.test","test");
Run Code Online (Sandbox Code Playgroud)
现在我想要这个,我会检查这个“测试”别名是否已经创建,我不会创建,我不会创建。
那可能吗?如果那可能怎么办?如果不可能,你能提供任何其他解决方案吗?
我正在使用带有oracle 11的Hibernate 5.2,它不支持仅获取第一行,我需要回到旧式的hibernate.是否有任何hibernate配置来做到这一点?