我有三个表,A,B,C,其中A是多对一B,B是多对一C.我想要一个A中所有C的列表.
我的表是这样的:A [id,valueA,lookupB],B [id,valueB,lookupC],C [id,valueC].我用两个嵌套的SELECT编写了一个查询,但我想知道是否有可能以某种方式使用DISTINCT进行INNER JOIN.
SELECT valueC
FROM C
INNER JOIN
(
SELECT DISTINCT lookupC
FROM B INNER JOIN
(
SELECT DISTINCT lookupB
FROM A
)
A2 ON B.id = A2.lookupB
)
B2 ON C.id = B2.lookupC
Run Code Online (Sandbox Code Playgroud)
编辑:表格相当大,A是500k行,B是10k行,C是100行,所以如果我做一个基本的内部连接并最后使用DISTINCT,有很多不必要的信息,如下所示:
SELECT DISTINCT valueC
FROM
C INNER JOIN B on C.id = B.lookupB
INNER JOIN A on B.id = A.lookupB
Run Code Online (Sandbox Code Playgroud)
这非常非常慢(比我上面嵌套的SELECT慢一倍.
我试图了解hibernate查询缓存是如何工作的.我现在看到的是,当我将新实体插入数据库时,Hibernate不会自动更新其二级缓存(尽管我只使用Hibernate调用).我发现使其工作的唯一方法是在插入新实体后手动清理缓存.
这是更具体的例子.我有一个名为Container的持久化实体,可以有很多项.我希望缓存所有项目:
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) class Item { // rest of the code ... } class Container { @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public List getItems() { ... } // rest of the code ... }
我注意到的问题是,当我:
1)从db读入一些容器到内存(连同相应的项目)
String hql =
"from Container c left join fetch c.items where c.type = 1";
List<Item> list = hibernateTemplate.find(hql);
Run Code Online (Sandbox Code Playgroud)
2)为所选容器插入新项目
hibernateTemplate.save(item)
Run Code Online (Sandbox Code Playgroud)
3)重复第一步
然后在第3步中我看不到我在第二步中插入的项目.只有在插入新项目后手动清理缓存时才会看到它们:
sessionFactory.evictCollection("Container.items", updatedContainerId)
Run Code Online (Sandbox Code Playgroud)
我的直觉告诉我,Hibernate应该自动执行这样的缓存失效.有没有人看到它的工作?我做错了什么还是不支持?
在此先感谢您的回答.问候汤姆
想象一下以下类型:
public struct Account
{
public int Id;
public double Amount;
}
Run Code Online (Sandbox Code Playgroud)
IList<Account>
在C#2.0中同步两个的最佳算法是什么?(没有linq)?
第一个列表(L1)是引用列表,第二个列表(L2)是根据第一个列表同步的列表:
ID标识帐户.找到一个天真的工作算法并不难,但我想知道是否有一个智能解决方案来处理这种情况而不会破坏可读性和性能.
编辑:
在Kohana/CodeIgniter中,我可以使用以下格式的URL:
http://www.name.tld/controller_name/method_name/parameter_1/parameter_2/parameter_3 ...
Run Code Online (Sandbox Code Playgroud)
然后按如下方式读取控制器中的参数:
class MyController
{
public function method_name($param_A, $param_B, $param_C ...)
{
// ... code
}
}
Run Code Online (Sandbox Code Playgroud)
你如何在Zend框架中实现这一目标?
我正在使用org.w3c
XML API
打开现有XML
文件.我正在删除一些节点,而我正在添加其他节点.
问题是添加的新节点是一个接一个地写入的,没有换行符,也没有缩进.虽然XML
文件确实有效,但人们很难检查它.
无论如何都要添加缩进,或者至少在每个节点后添加换行符?
在C#中是否有typedef等价物,或者某种类似的行为?我做了一些谷歌搜索,但我看到的每个地方似乎都是负面的.目前我的情况类似于以下情况:
class GenericClass<T>
{
public event EventHandler<EventData> MyEvent;
public class EventData : EventArgs { /* snip */ }
// ... snip
}
Run Code Online (Sandbox Code Playgroud)
现在,当试图为该事件实现处理程序时,并不需要火箭科学家弄清楚这会很快导致大量输入(为可怕的双关语道歉).它最终会像这样:
GenericClass<int> gcInt = new GenericClass<int>;
gcInt.MyEvent += new EventHandler<GenericClass<int>.EventData>(gcInt_MyEvent);
// ...
private void gcInt_MyEvent(object sender, GenericClass<int>.EventData e)
{
throw new NotImplementedException();
}
Run Code Online (Sandbox Code Playgroud)
除了在我的情况下,我已经使用了复杂类型,而不仅仅是一个int.如果有可能简化这一点,那就太好了......
编辑:即.也许键入定义EventHandler而不是需要重新定义它以获得类似的行为.
我应该如何配置类以将三个下拉列表(日期,月份,年份)绑定到单个Date属性,以使其按照"每个属性的单个请求参数"方案的工作方式工作?我想应该通过重写initBinder方法添加一些自定义PropertyEditors.还有什么 ?
我使用瑞典语版本的Windows XP和Visual Studio Professional开发ASP.NET应用程序.什么时候我得到一个错误aka."死亡的黄色屏幕"错误信息是瑞典语,使搜索有关它的信息有点困难.
如何更改ASP.NET中的错误消息使用的语言?
我没有为.net框架安装语言包.然而,我正在运行一个带有瑞典语界面包的英文windows xp.
我的web.config中也有这个:
<system.web>
<globalization uiCulture="en-US" />
</system.web>
Run Code Online (Sandbox Code Playgroud) 我是.Net程序员(包括C#和VB.net),我也想进入F#区域,但是找不到一些好的在线文章/ pdf.请指导我完成这个.
我的应用程序有一个命令行界面,我正在考虑使用GNU Readline库来提供历史记录,可编辑的命令行等.
问题是我的命令可能很长而且复杂(想想SQL),我想让用户在多行上传播命令,使它们在历史记录中更具可读性.
是否可以在readline中执行此操作(可能通过指定换行符和命令结尾之间的差异)?
或者我会更好地实现自己的命令行(但可能使用GNU历史库)?
.net ×2
c# ×2
java ×2
algorithm ×1
asp.net ×1
c ×1
caching ×1
command-line ×1
distinct ×1
f# ×1
formatting ×1
gnu ×1
hibernate ×1
inner-join ×1
list ×1
optimization ×1
php ×1
pretty-print ×1
readline ×1
spring-mvc ×1
sql ×1
typedef ×1
xml ×1