我对Hibernate的预测和标准有点困惑.何时使用预测以及何时使用标准?
请帮我.谢谢!
作为nHibernate及其实用程序库的新用户,流畅的nhibernate,我正在努力学习一个好的数据库是危险的.
我对于预测的概念有着极大的困难.具体来说,他们是世界上的什么?
我确实在' 什么是预测?'和' nHibernate中的项目 '和' nHibernate,Projections,Definition '等等.我仍然很困惑.到目前为止最有用的帖子是其他StackOverflow问题和Colin Ramsay撰写的此博客文章.但我仍然非常困惑.我对数据库的了解至多仍然是入门级的.
我真的不明白什么是预测,我为什么要使用它们,它们正在完成什么,等等.我在博客文章中看到他正在使用它们来获取整数列表(我假设主键)这样他可以在不同的查询中使用它们,但这在它运行的方式和原因上有点模糊.
在属性上使用投影时,结果将作为列表返回,其中元素的顺序与投影块中定义的顺序相同.同时,列表中缺少属性名称,这对开发人员来说确实是不利的,因为结果将被传递,并且调用者需要知道哪个值属于哪个属性.有没有办法从Criteria查询返回一个带有属性名称作为值的键的映射?
所以,以下代码:
def c = Trade.createCriteria()
def remicTrades = c.list {
projections {
property('title', 'title')
property('author.name', 'author')
}
def now = new Date()
between('publishedDate', now-365, now)
}
Run Code Online (Sandbox Code Playgroud)
返回:
[['book1', 'author1']['book2', 'author2']]
Run Code Online (Sandbox Code Playgroud)
相反,我希望它返回:
[[book:'book1', author:'author1'][book:'book2', author:'author2']]
Run Code Online (Sandbox Code Playgroud)
我知道我可以在得到结果之后安排这种方式,但我认真地认为标准应该使用属性别名来返回模仿SQL查询结果的地图列表,而不是一个平淡无奇的列表.
我想从NHibernate获取这个SQL:
SELECT SUM(color_pages) * SUM(total_pages)
FROM connector_log_entry
GROUP BY department_name
Run Code Online (Sandbox Code Playgroud)
但我无法在任何地方找到任何算术运算(*)投影.
这是我到目前为止的代码:
Session.QueryOver<ConnectorLogEntry>()
.SelectList(list => list
.SelectGroup(m => m.DepartmentName)
.WithAlias(() => dto.Department)
.Select(Projections.Sum<ConnectorLogEntry>(m => m.TotalPages))
//.Select(Projections.Sum<ConnectorLogEntry>(m => m.ColorPages))
.WithAlias(() => dto.TotalColorPercentage))
.TransformUsing(Transformers.AliasToBean<DepartmentConsumption>());
Run Code Online (Sandbox Code Playgroud) public class SearchText
{
public virtual int Id { get; set; }
public virtual string Text { get; set; }
}
public class SearchTextLog
{
public virtual int Id { get; set; }
public virtual SearchText SearchText { get; set; }
public virtual User User { get; set; }
public virtual int SearchCount { get; set; }
public virtual DateTime LastSearchDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我试图根据SearchTextLog中的计数总和选择前5个SearchText项.目前我只能通过首先执行查询来获取前5个项目,然后在第二个查询中使用结果来解决此问题.我想知道是否有人可以向我展示光线,并教我如何将这两个单独的查询整合到一个单元中.
这是我目前的情况:
var topSearchCriteria = Session.CreateCriteria(typeof (SearchTextLog))
.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("SearchText.Id"))
.Add(Projections.Alias(Projections.Sum("SearchCount"), "SearchCount")))
.AddOrder(Order.Desc("SearchCount"))
.SetMaxResults(topSearchLimit)
.List<int>(); …Run Code Online (Sandbox Code Playgroud) 我想在NHibernate中编写一个Projection查询,按日期对记录进行分组,并为这些记录计算"Tax"字段值.我的问题是数据库的值是DateTime,我将如何按日期而不是时间对记录进行分组.这是我的代码
template.Criteria.SetProjection(
Projections.ProjectionList()
.Add(Projections.GroupProperty("IssueDatetime"), "DateVal")
.Add(Projections.Sum("Tax"), "TotalFare")
);
Run Code Online (Sandbox Code Playgroud)
数据库将IssueDatetime字段存储为DateTime类型.我想计算每个日期的税,并忽略时间部分.有人可以帮我解决上述要求吗?
基本上,我一直在尝试这样做(根据两列计算不同):
select count(distinct(checksum(TableA.PropertyA, TableB.PropertyB)))
from TableA
left outer join TableB
on TableA.TableBId = TableB.Id
where PropertyA like '%123%'
Run Code Online (Sandbox Code Playgroud)
谷歌搜索如何做到这一点,但没有运气.试过这个,但从未真正奏效过.这并不明显基于两个表中的两个属性:
var queryOver = c.QueryOver<TableA>();
TableB tableBAlias = null;
TableA tableAAlias = null;
ProjectionList projections = Projections.ProjectionList();
queryOver.AndRestrictionOn(x => x.PropertyA).IsLike("%123%");
projections.Add(Projections.CountDistinct(() => tableAAlias.PropertyA));
queryOver.JoinAlias(x => x.TableB , () => tableBAlias, JoinType.LeftOuterJoin);
projections.Add(Projections.CountDistinct(() => tableBAlias.PropertyB));
queryOver.Select(projections);
queryOver.UnderlyingCriteria.SetProjection(projections);
return queryOver.TransformUsing(Transformers.DistinctRootEntity).RowCount();
Run Code Online (Sandbox Code Playgroud) sql nhibernate nhibernate-criteria nhibernate-projections queryover
我正在使用Grails Criteria(类似于hibernate标准)来获取给定表中每个部门中获得最高分的学生列表.而我想要的只是Name,Division和Grade领域.
Name | Division | Grade | Std_id
---------------------------------
AA1 | A | 2 | 1
AA2 | A | 4 | 2
BB1 | B | 2 | 3
BB2 | B | 5 | 4
Run Code Online (Sandbox Code Playgroud)
我想要的结果是
Name | Division | Grade |
--------------------------
AA2 | A | 4 |
BB2 | B | 5 |
Run Code Online (Sandbox Code Playgroud)
如果我使用以下标准
def criteria = Student.createCriteria()
def resultlt = criteria.list {
projections {
groupProperty('divison')
max('grade') …Run Code Online (Sandbox Code Playgroud) grails hibernate criteria hibernate-criteria nhibernate-projections
我正在使用NH Criteria检索实体并将选择性字段投影到自定义类(有点像将数据投影到ViewModel上以便在MVC视图上显示).
使用ProjectionList很容易:
var emailCriteria = mSession.CreateCriteria<Email>();
emailCriteria.SetProjection(
Projections.ProjectionList()
.Add(Projections.Property("Subject"), "Subject")
);
emailCriteria.SetResultTransformer(Transformers.AliasToBean<EmailDataModel>());
var result = emailCriteria.List<EmailDataModel>();
Run Code Online (Sandbox Code Playgroud)
但是,我的实体包含一个集合,我也希望将它带回来,并将其作为集合投影到我的自定义类中.
我的域模型看起来(简化形式)如下:
public class Email {
public string Subject
public List<EmailAttachment> Attachments
etc...
}
public class EmailAttachment {
public UploadedFile File
}
public class UploadedFile {
public string Filename
public UploadedFileData Data
}
public class UploadedFileData {
public byte[] Data
}
Run Code Online (Sandbox Code Playgroud)
这是我要投影到的"数据模型"类:
public class EmailDataModel {
public string Subject
public List<EmailAttachmentDataModel> Attachments
}
public class EmailAttachmentDataModel {
public string Filename
public byte[] Data …Run Code Online (Sandbox Code Playgroud) 我有以下查询,
SearchTemplate Template = new SearchTemplate();
Template.Criteria = DetachedCriteria.For(typeof(table1));
Template.Criteria.CreateCriteria("table2", "Usr", NHibernate.SqlCommand.JoinType.InnerJoin)
.SetProjection(Projections.ProjectionList()
.Add(Projections.Count("Usr.ID"), "UserCount")
.Add(Projections.GroupProperty("Location"), "ALocation")
.Add(Projections.GroupProperty("Company"), "ACompany")
.Add(Projections.GroupProperty("Usr.Designation"), "ADesignation"));
Run Code Online (Sandbox Code Playgroud)
上面的查询给我数据,
Location Company Designation Count
Florida A Manager 3
Florida A QA 5
Texas B Manager 6
Texas B QA 7
Run Code Online (Sandbox Code Playgroud)
有没有办法更改查询,以便它提供数据,
Location Company Manager QA
Florida A 3 5
Texas B 6 7
Run Code Online (Sandbox Code Playgroud)
这里Manager和QA是唯一可以进入指定字段的值.
我有一个nhibernate问题,我正在投影sql Coalesce函数.
我正在比较来自两个不同实体的两个具有相同名称的字符串属性.在生成的sql中,仅比较来自第一个实体的相同属性:
var list = Projections.ProjectionList();
list.Add(
Projections.SqlFunction("Coalesce",
NHibernateUtil.String,
Projections.Property<TranslatedText>(tt => tt.ItemText),
Projections.Property<TextItem>(ti => ti.ItemText)));
var q = Session.QueryOver<TextItem>()
.Left.JoinQueryOver(ti => ti.TranslatedItems);
Run Code Online (Sandbox Code Playgroud)
在这个sql中评估q结果
coalesce(this_.ItemText, this_.ItemText)
Run Code Online (Sandbox Code Playgroud)
将this_在RHS需要有一个别名表
我可以使用, Projections.Alias(Projections.Property<TranslatedText>(tt => tt.ItemText), "ttAlias")但不知道如何映射"ttAlias" JoinQueryOver.
我也可以在那里创建一个别名,但是看不到如何命名它.
TranslatedText ttAlias = null;
...
JoinQueryOver(ti => ti.TranslatedItems, () => ttAlias)
Run Code Online (Sandbox Code Playgroud) nhibernate ×7
criteria ×4
c# ×3
queryover ×3
grails ×2
hibernate ×2
aggregate ×1
collections ×1
grails-orm ×1
math ×1
sql ×1