<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>ORM - tag - 沐木</title><link>https://oldletter.cn/tags/orm/</link><description>ORM - tag - 沐木</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 10 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://oldletter.cn/tags/orm/" rel="self" type="application/rss+xml"/><item><title>Java 为什么不能直接解析 Lambda？从一个 ORM 查询说起</title><link>https://oldletter.cn/posts/java-lambda-parse-01-why/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/java-lambda-parse-01-why/</guid><description><![CDATA[<blockquote>
<p>📅 2026-06-10 | 🏷️ Java, Lambda, JVM | 📖 阅读约 15 分钟</p></blockquote>
<hr>
<h2 id="问题起源">问题起源</h2>
<p>做 Java ORM 的时候，更让人羡慕的就是 C# 的 LINQ：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-csharp">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title=""><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-csharp" data-lang="csharp"><span class="line"><span class="cl"><span class="c1">// C# — 直接写 Lambda，框架自动转 SQL</span>
</span></span><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">users</span> <span class="p">=</span> <span class="k">await</span> <span class="n">context</span><span class="p">.</span><span class="n">Users</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="n">Where</span><span class="p">(</span><span class="n">u</span> <span class="p">=&gt;</span> <span class="n">u</span><span class="p">.</span><span class="n">Age</span> <span class="p">&gt;</span> <span class="m">18</span> <span class="p">&amp;&amp;</span> <span class="n">u</span><span class="p">.</span><span class="n">Name</span> <span class="p">==</span> <span class="s">&#34;Tom&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="n">OrderBy</span><span class="p">(</span><span class="n">u</span> <span class="p">=&gt;</span> <span class="n">u</span><span class="p">.</span><span class="n">Id</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="n">ToListAsync</span><span class="p">();</span></span></span></code></pre></div></div>
<p>我们也想在 Java 里这么写：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-java">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title=""><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="c1">// 理想中的 Java ORM 写法</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">query</span><span class="p">.</span><span class="na">where</span><span class="p">(</span><span class="n">u</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">u</span><span class="p">.</span><span class="na">getAge</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">18</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">u</span><span class="p">.</span><span class="na">getName</span><span class="p">().</span><span class="na">equals</span><span class="p">(</span><span class="s">&#34;Tom&#34;</span><span class="p">));</span></span></span></code></pre></div></div>
<p>但试了一下就发现，<strong>Java 运行时核心拿不到 Lambda 里面的结构</strong>。<code>u -&gt; u.getAge() &gt; 18</code> 这个表达式，运行时只能执行它（传一个 User 进去，返回 true/false），但拿不到&quot;age &gt; 18&quot;这个结构信息。</p>]]></description></item></channel></rss>