假设我有以下Domain类:
class Book {
String title
String author
byte[] largeCoverArtImage
}
Run Code Online (Sandbox Code Playgroud)
我有一个列表视图,我不需要显示largeCoverArtImage,如何使用GORM Criteria执行以下SQL查询?
select title, author from Book
Run Code Online (Sandbox Code Playgroud) 是否可以使用hibernate critiria api创建"select in"查询?
示例:我在1:n关系,公司和部门中有两个表
select * from company c where c.id in (select company_id from department d
where d.departmentname = 'HR' and d.location = 'xyz')
Run Code Online (Sandbox Code Playgroud) 我试图通过加入我的实体类来创建BO
Criteria criteria = session.createCriteria(Report.class,"r");
criteria
.createAlias("template", "t")
.createAlias("constituents", "rc")
.createAlias("rc.entity", "pe")
.createAlias("pe.model", "m")
.createAlias("pe.scenario", "s")
.setProjection(Projections.projectionList()
.add( Projections.property("r.Id"))
.add( Projections.property("t.Typ"))
.add( Projections.property("pe.bId"))
.add( Projections.property("m.model"))
.add( Projections.property("s.decay"))
).setMaxResults(100)
.addOrder(Order.asc("r.Id"))
.setResultTransformer(Transformers.aliasToBean(BO.class));
Run Code Online (Sandbox Code Playgroud)
我得到100个空BO,即所有属性都为null我的BO如下
public class BO implements Serializable {
private static final long serialVersionUID = 1L;
private int Id;
private String Typ;
private String bId;
private String model;
private String decay;
Getters and Setters
Run Code Online (Sandbox Code Playgroud)
.....
当我删除行aliasToBean并迭代Object []时,我可以看到获取的正确值请指导我...
假设我有一个实体MyEntity,它有一个基于公式的属性fmlaProp.现在说我创建一个标准:
s.createCriteria(MyEntity.class)
.setProjection(
Projections.distinct(
Projections.property("fmlaProp")))
.addOrder(Order.asc("fmlaProp"));
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我得到以下SQL:
SELECT DISTINCT fmlaProp-sql FROM MY_ENTITY_TABLE ORDER BY fmlaProp-sql
Run Code Online (Sandbox Code Playgroud)
这给了Oracle一个错误,说明了order-by表达式是未选中的.然后我尝试了以下标准:
s.createCriteria(MyEntity.class)
.setProjection(
Projections.distinct(
Projections.alias(
Projections.property("fmlaProp"),
"alias1"))
.addOrder(Order.asc("alias1"));
Run Code Online (Sandbox Code Playgroud)
哪个生成"按别名排序1",工作正常.但它有点难看 - 代码必须"知道"那些违反"一次写入"原则的公式属性.对此有何想法或建议?先感谢您.
我有以下域对象:
class User {
String name
Transaction transaction
static constraints = {
transaction nullable: true
}
}
class Transaction {
boolean successful
User user
static belongsTo = User
}
Run Code Online (Sandbox Code Playgroud)
我想选择所有users没有成功交易的东西.这意味着我希望没有任何transaction(transaction == null)的用户和具有成功值false(transaction.successful == false)的事务的用户.我想使用Criteria API执行此操作(因为这可以与基于用户输入的其他条件结合使用).
我试过这个:
def c = User.createCriteria()
def results = c {
or {
isNull 'transaction'
transaction {
eq 'successful', false
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这只给了我有交易的用户(成功的价值false).但我没有得到交易所在的用户null
以下代码显示了我如何创建一些示例数据:
def createUserAndTransaction(String name, Boolean successful = null) {
User u …Run Code Online (Sandbox Code Playgroud) 我有root实体Hostel及其单一关联User owner.
当我获取Hostel实体时,我需要急切地获取User owner,但只有owner3个属性:userId,firstName,lastName.
现在我的标准查询是:
Criteria criteria = currenSession().createCriteria(Hostel.class);
criteria.add(Restrictions.ge("endDate", Calendar.getInstance()));
if (StringUtils.notNullAndEmpty(country)) {
criteria.add(Restrictions.eq("country", country));
}
Long count = (Long) criteria
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.setProjection(Projections.rowCount()).uniqueResult();
criteria.setFetchMode("owner", FetchMode.SELECT);
criteria.addOrder(Order.desc("rating"));
// needed to reset previous rowCount projection
criteria.setProjection(null);
// retrieve owner association
criteria.createAlias("owner", "owner", JoinType.LEFT_OUTER_JOIN)
.setProjection(
Projections.projectionList()
.add(Projections.property("owner.userId"))
.add(Projections.property("owner.firstName"))
.add(Projections.property("owner.lastName")));
criteria.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
Run Code Online (Sandbox Code Playgroud)
接下来,我这样做criteria.list(),我得到sql语句,它只选择owner投影列表中指定的3个属性.但它不会选择root Hostel实体的任何属性.生成的查询是:
select
owner1_.user_id as y0_,
owner1_.firstName as y1_,
owner1_.lastName as y2_
from
HOSTEL this_
left outer …Run Code Online (Sandbox Code Playgroud) 我有一个包含mamy列的表,我想更新行的一列或几列而不影响我可以编写查询的剩余列:
update table as t set t.a=:a set t.b=:b where t.id=1
Run Code Online (Sandbox Code Playgroud)
但看到我不知道将选择哪些列进行更新,我认为为每个场景编写每个查询都不是一个好主意.好吧,我必须为每个场景编写查询,但我正在寻找一种更好的方法来动态更新表.我认为标准是一个不错的选择.但问题是我不知道如何编写标准更新特定列.我的代码现在可以更新列,但它会将其他列设置为null或为空.
在不更改其他列的情况下更新特定列的好方法是什么?
考虑类Account,RealAccount和VirtualAccount,以及Operation:
class Account { }
class RealAccount extends Account { String name; }
class VirtualAccount extends Account { }
class Operation { Account account; }
Run Code Online (Sandbox Code Playgroud)
这意味着:
RealAccount一个叫做的字段name.Operation的帐户可以是RealAccount或VirtualAccount.我想查询Operation属于RealAccount具有特定名称的所有s :
session.createCriteria(Operation.class)
.createAlias("account", "_account")
.add(Restrictions.eq("_account.name", "Alice"))
.list();
Run Code Online (Sandbox Code Playgroud)
这失败了.
我的问题:使用"旧"的Hibernate API的标准,我怎么可以查询该账户名称只存在当Operation的帐户是RealAccount?也许是一些包容DetachedCriteria和Subqueries......
tl;dr: Hibernate automatically generates SQL table aliases in its queries like jurisdicti4_ or this_. Here's an example query:
SELECT
this_.id AS id2_6_3_,
this_.a_table_column AS a_table_column3_6_3_,
jurisdicti4_.b_table_column AS b_table_column4_6_3_,
FROM
app_table_a this_
LEFT OUTER JOIN jurisdiction jurisdicti4_ ON this_.jurisdiction = jurisdicti4_.name
WHERE
this_.a_table_column = ?
Run Code Online (Sandbox Code Playgroud)
I'm using the Hibernate Criteria API to add some hints that need reference the SQL aliases in the query, so I need to know how to either:
我有我的实体:
@Entity
@Table(name="performances")
@AssociationOverrides({
@AssociationOverride(name="id.player", joinColumns=@JoinColumn(name="player_id")),
@AssociationOverride(name="id.season", joinColumns=@JoinColumn(name="season_id"))
})
public class Performance extends AbstractEntity<PerformanceID> {
private static final long serialVersionUID = 1L;
@EmbeddedId
@Getter @Setter
private PerformanceID id;
@Getter @Setter
private int goals;
public Player getPlayer(){
return id.getPlayer();
}
public Season getSeason(){
return id.getSeason();
}
Run Code Online (Sandbox Code Playgroud)
和:
@Embeddable
public class PerformanceID implements Serializable {
private static final long serialVersionUID = 1L;
@ManyToOne(fetch=FetchType.LAZY, targetEntity=Player.class)
@JoinColumn(name="player_id")
@Getter @Setter
private Player player;
@ManyToOne(fetch=FetchType.LAZY, targetEntity=Season.class)
@JoinColumn(name="season_id")
@Getter @Setter
private Season season;
Run Code Online (Sandbox Code Playgroud)
如何选择玩家名称为"Claudio"的演出记录?在HQL中,它只是工作:
Query query = …Run Code Online (Sandbox Code Playgroud)