我想利用 Criteria API 的独立于数据库的 HQL 和类型安全。但我没有实体类。
我可以直接使用 Criteria API 吗?
我需要根据一些不同的限制来检索项目,一种是代码为 234,另一种是计算出的数量小于 10,但我不确定如何将值传递给 sqlRestrictions 方法。
我正在使用 {alias} 但它传递 Item 而不是 city 给这个。
List<Store> stores = (List<Store>) sessionFactory.getCurrentSession()
.createCriteria(Item.class)
.createAlias("Address", "address")
.createAlias("address.myJoinTable.city", "city")
.setProjection(pl)
.add(Restrictions.eq("address.myJoinTable.city",
session.load(City.class, myId)))
.add(Restrictions
.sqlRestriction("SELECT (
{alias}.id * {alias}.code * "
+ mynumber1 + " * " + mynumber2 + ")
as number from city
HAVING number < 10")
.setResultTransformer(
new AliasToBeanResultTransformer(Store.class))
.list();
Run Code Online (Sandbox Code Playgroud) 我在使用 hibernate 从 java 实体中的枚举更新 postgres 数据库中的枚举字段时遇到问题,导致标题中出现错误。
我的数据库看起来像这样
\dT fulfillment_status
List of data types
Schema | Name | Description
--------+--------------------+-------------
public | fulfillment_status |
(1 row)
Run Code Online (Sandbox Code Playgroud)
这设置特定列fulfillment_status的类型,即
Column | Type | Collation | Nullable | Default
----------------------------+--------------------------------+-----------+----------+--------------------------------------
fulfillment_status | fulfillment_status | | not null |
Run Code Online (Sandbox Code Playgroud)
java实体类的相关章节
@Entity
@Table(name = "payments", uniqueConstraints = { @UniqueConstraint(columnNames = {"id"})})
public class Payment {
private FulfillmentStatus fulfillmentStatus;
public enum FulfillmentStatus {
PENDING, FULFILLED, FAILED, ABORTED
}
@Enumerated(EnumType.STRING)
@Column(name = "fulfillment_status", nullable = false, columnDefinition …Run Code Online (Sandbox Code Playgroud) 我们有 HibernateMetadataBuilderContributor 如下所示。它适用于 Hibernate 5 或 Spring boot 2.7。但当我们迁移到 Hibernate 6 或 Spring boot 3 时就不起作用了。
public class HibernateMetadataBuilderContributor implements MetadataBuilderContributor {
public static final String STRING_AGG = "string_agg";
public static final String STRING_AGG_ORDER_BY = "string_agg_order_by";
public static final String STRING_AGG_DISTINCT = "string_agg_distinct";
@Override
public void contribute(final MetadataBuilder metadataBuilder) {
metadataBuilder.applySqlFunction(STRING_AGG, new SQLFunctionTemplate(StandardBasicTypes.STRING, "string_agg(?1, ?2)"));
metadataBuilder.applySqlFunction(STRING_AGG_ORDER_BY, new SQLFunctionTemplate(StandardBasicTypes.STRING, "string_agg(?1, ?2 order by ?3)"));
metadataBuilder.applySqlFunction(STRING_AGG_DISTINCT, new SQLFunctionTemplate(StandardBasicTypes.STRING, "string_agg(distinct ?1, ?2)"));
}
}
Run Code Online (Sandbox Code Playgroud)
在 Hibernate 6 中找不到 SQLFunctionTemplate,有什么替代方案吗?
hibernate hibernate-criteria spring-data spring-data-jpa spring-boot
我一直在尝试创建一个包含belongsTo关系的标准构建器,但尚未成功.考虑以下模型:
class Msg {
...
static belongsTo = [user: User]
...
}
class User {
...
Organisation organisation
...
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试进行以下查询:
Msg.createCriteria().list() {
...
user {
eq("organisation", organisationInstance)
}
...
}
Run Code Online (Sandbox Code Playgroud)
我得到的只是以下错误
ERROR errors.GrailsExceptionResolver - No signature of method: static User.call() is applicable for argument types: (MsgService$_findMessages_closure1_closure6) values: [MsgService$_findMessages_closure1_closure6@afcba8]
Possible solutions: save(), wait(), any(), getAll(), save(java.lang.Boolean), save(java.util.Map)
Run Code Online (Sandbox Code Playgroud)
我试图在条件查询中添加不同的小添加项,例如:
join "user"
fetchMode("user", org.hibernate.FetchMode.EAGER)
Run Code Online (Sandbox Code Playgroud)
但仍然遇到同样的问题.
我甚至尝试将以下静态映射添加到Msg类:
static mapping = {
columns {
user lazy: false
}
}
Run Code Online (Sandbox Code Playgroud)
还是行不通.
有没有办法使用包含belongsTo查询的条件构建器?
感谢您的帮助.
吕西安
在我们的C#代码中,我们已经在尝试访问变量之前测试了变量是否为null.
if (myInt.HasValue) {
var yourInt = myInt;
// do something with yourInt
}
Run Code Online (Sandbox Code Playgroud)
我的问题:使用可空属性是否有区别,就好像它在测试之后不是以下情况一样?
if (myInt.HasValue) {
var yourInt = myInt.Value; // see the difference?
// do something with yourInt
}
Run Code Online (Sandbox Code Playgroud)
这只是一个偏好问题,或者.Value即使在可以为空的对象通过该测试之后,是否存在明显的原因或性能影响?
UPDATE
我扩展了我的第二个例子,我们已经测试过HasValue,但我们用它.Value来访问该值.
更新2
我更新了示例以使用vars,因为在我们的代码中我们实际上并没有使用int类型,抱歉这个糟糕的例子.在我们的代码中,我们实际上只是使用NHibernate Criteria查询中的对象 - Expression.Eq("thing", myInt)查询.
这不会引发编译错误.我试图简化示例以获得我的问题的根源而不涉及NHibernate.很抱歉,如果这会使某些答案无效.如果我们强制使用另一种方法来查找值而不是显式调用,我只是试图查看性能是否受到打击.Value.
如何使用hibernate标准编写条件的条件.
我需要转换的查询是
SELECT date, product, IF(type = 'msrp', amount, 0) price,
IF(type != 'msrp', amount, 0) tax FROM productdetail group by date, product;
Run Code Online (Sandbox Code Playgroud)
请在休眠标准中提供if语句的正确用法.
我正在使用Hibernate 4.3.1 final,Mysql 5.5,我想在一些连接的实体上使用"逐个命令"的命令逻辑.
我希望实现的纯sql表示如下所示:
select adv.id, adv.published_date
from advert as adv
join account as act on act.id = adv.act_id
join account_status as aas on aas.id = act.current_aas_id
order by case aas.status
when 'pending' THEN 1
when 'approved' THEN 1
else 2
end, adv.published_date;
Run Code Online (Sandbox Code Playgroud)
这会将待处理帐户和已批准帐户的广告排在拒绝帐户的广告之前.
我已经设法使用hibernate标准执行所有选择查询,但我不确定如何使用该api指定case case语句.
我发现这篇文章:
但我需要按顺序引用连接的实体类,我不知道该怎么做.
任何帮助或建议非常感谢.
问题很简单,可以使用Criteria或DetachedCriteria在Hibernate中完成此查询吗?我想不是,但我想做这个问题可能存在一个解决方法.
SELECT
COLUMNS
FROM table
WHERE id not in (
SELECT * FROM (
SELECT id
FROM table
WHERE
SOMECONDITIONS
ORDER BY timestamp desc limit 0, 15
)
as t);
Run Code Online (Sandbox Code Playgroud)
我将@Dean Clark的答案标记为正确,但另一个问题出现如下
where can i find the findByCriteria from SessionFactory we are not using Spring
Run Code Online (Sandbox Code Playgroud) 我有一个名为表messages含toUser,message和status列.我想更新特定用户的所有消息状态.
所以,我写了这样一个查询,
Session s = DB.getSession();
s.createSQLQuery("UPDATE `message` SET `status`='0' WHERE `toUser`='3'").executeUpdate();
s.close();
Run Code Online (Sandbox Code Playgroud)
但后来我被告知使用纯hibernate方法更新更快更有效(我认为它必须对hibernate池做一些事情),如下所示.
Session s = DB.getSession();
Transaction tr = s.beginTransaction();
Criteria cr = s.createCriteria(Connection.Pojo.Message.class);
cr.add(Restrictions.eq("toUser", 3));
List<Connection.Pojo.Message> l = cr.list();
for (Connection.Pojo.Message msg : l) {
msg.setStatus((byte) 0);
s.update(msg);
}
tr.commit();
s.close();
Run Code Online (Sandbox Code Playgroud)
那么,我的问题是更新这些行的最快方法是什么?如果可能,请提供详细的答案.
谢谢你的建议.
hibernate ×8
java ×4
mysql ×4
criteria ×2
c# ×1
criteria-api ×1
enums ×1
grails ×1
grails-orm ×1
nhibernate ×1
nullable ×1
postgresql ×1
spring-boot ×1
spring-data ×1